application.properties配置文件的配置(消费者的配置):
#连接地址
v2.spring.rabbitmq.host=11.110.1.11
#连接端口
v2.spring.rabbitmq.port=5672
v2.spring.rabbitmq.username=用户名
v2.spring.rabbitmq.password=密码
#连接到rabbitMQ的vhost
v2.spring.rabbitmq.virtual-host=123546
v2.spring.main.allow-bean-definition-overriding=true
v2.spring.redis.database=0
v2.spring.redis.lettuce.pool.max-active=20
#consume 手动 ack
#v2.spring.rabbitmq.listener.simple.acknowledge-mode=manual
#1.当mandatory标志位设置为true时,
# 如果exchange根据自身类型和消息routingKey无法找到一个合适的queue存储消息,
# 那么broker会调用basic.return方法将消息返还给生产者;
#2.当mandatory设置为false时,出现上述情况broker会直接将消息丢弃;通俗的讲,
# mandatory标志告诉broker代理服务器至少将消息route到一个队列中,
# 否则就将消息return给发送者;
v2.spring.rabbitmq.template.mandatory=true
#publisher confirms 发送确认
v2.spring.rabbitmq.publisher-confirms=true
#returns callback :
# 1.未送达exchange
# 2.送达exchange却未送道queue的消息 回调returnCallback.(注意)出现2情况时,publisher-confirms 回调的是true
v2.spring.rabbitmq.publisher-returns=true
v2.spring.rabbitmq.listener.simple.prefetch=5
程序代码:
@Slf4j
@Component
@Configuration
public class MultipleRabbitMQConfig {//MQ连接信息@Bean(name = "v2ConnectionFactory")public CachingConnectionFactory hospSyncConnectionFactory(@Value("${v2.spring.rabbitmq.host}") String host,@Value("${v2.spring.rabbitmq.port}") int port,@Value("${v2.spring.rabbitmq.username}") String username,@Value("${v2.spring.rabbitmq.password}") String password,@Value("${v2.spring.rabbitmq.virtual-host}") String virtualHost,@Value("${v2.spring.rabbitmq.publisher-confirms}") Boolean publisherConfirms,@Value("${v2.spring.rabbitmq.publisher-returns}") Boolean publisherReturns) {CachingConnectionFactory connectionFactory = new CachingConnectionFactory();connectionFactory.setHost(host);connectionFactory.setPort(port);connectionFactory.setUsername(username);connectionFactory.setPassword(password);connectionFactory.setVirtualHost(virtualHost);connectionFactory.setPublisherConfirms(publisherConfirms);connectionFactory.setPublisherReturns(publisherReturns);return connectionFactory;}
//消费者的配置
@Bean(name = "v2ContainerFactory")
public SimpleRabbitListenerContainerFactory hospSyncFactory(@Qualifier("v2ConnectionFactory") ConnectionFactory connectionFactory,//@Value("${v2.spring.rabbitmq.listener.simple.acknowledge-mode}") String acknowledge,@Value("${v2.spring.rabbitmq.listener.simple.prefetch}") Integer prefetch
) {SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();factory.setConnectionFactory(connectionFactory);//factory.setAcknowledgeMode(AcknowledgeMode.valueOf(acknowledge.toUpperCase()));factory.setPrefetchCount(prefetch);return factory;
}
//生产者配置
@Bean(name = "v2RabbitTemplate")public RabbitTemplate firstRabbitTemplate(@Qualifier("v2ConnectionFactory") ConnectionFactory connectionFactory,@Value("${v2.spring.rabbitmq.template.mandatory}") Boolean mandatory) {RabbitTemplate v2RabbitTemplate = new RabbitTemplate(connectionFactory);v2RabbitTemplate.setMandatory(mandatory);v2RabbitTemplate.setConfirmCallback((correlationData, ack, s) -> {if (!ack) {LOGGER.info("{} 发送RabbitMQ消息 ack确认 失败);} else {LOGGER.info("{} 发送RabbitMQ消息 ack确认 成功);}});v2RabbitTemplate.setReturnCallback((message, code, s, exchange, routingKey) -> {
// LOGGER.error("{} 发送RabbitMQ消息returnedMessage,出现异常,Exchange不存在或发送至Exchange却没有发送到Queue中,message:[{}], code[{}], s[{}], exchange[{}], routingKey[{}]", new Object[]{this.name, JSON.toJSONString(message), JSON.toJSONString(code), JSON.toJSONString(s), JSON.toJSONString(exchange), JSON.toJSONString(routingKey)});});return v2RabbitTemplate;}
}
消费者的程序引用:
@Slf4j
@Component //泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。
public class ApprovalOfHeavyAssetsConsumer {
//生产者的引入配置
@Resource(name = "v2RabbitTemplate")
private RabbitTemplate v2RabbitTemplate;
/*** @param message message* @param channel channel* @throws Exception Exception*/
@RabbitHandler//注解指定目标方法来作为消费消息的方法,通过注解参数指定所监听的队列或者Binding
@RabbitListener(queues = "消费者队列名称", containerFactory = "v2ContainerFactory")
public void consume(Message message, Channel channel) {try {//消费数据,根据消息解析数据String content = new String(message.getBody(), StandardCharsets.UTF_8);JSONObject ltJsonlog = JSONObject.parseObject(content);} catch (Exception e) {// 失败后消息被确认// channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);log.error("消费者异常", e);}
}
//生产者发送消息
v2RabbitTemplate.convertAndSend("exchange", "routingKey", JOSN要发送的数据格式);
}