spring-boot-starter-amqp
amqp 高级消息队列协议
发送端:
- 新建项目,添加amqp依赖
- 修改配置
spring:
application:
name: mq52publisher
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
3.配置类,提供 TopicExchange Queue Binding 配置bean
4.发送消息
rabbitTemplate.convertAndSend(MQConfig.USER_EXCHANGE,MQConfig.USER_REG_RK,userRegMSG.toString());
接受端:
1.新建项目,添加amqp依赖
2.修改配置
3.配置类,提供的rabbitListener的ContainerFactory
@Autowired
private CachingConnectionFactory cachingConnectionFactory;
/**
* 消息监听器容器工厂
* @return
*/
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(){
SimpleRabbitListenerContainerFactory containerFactory = new SimpleRabbitListenerContainerFactory();
//连接工厂
containerFactory.setConnectionFactory(cachingConnectionFactory);
// ACK模式
containerFactory.setAcknowledgeMode(AcknowledgeMode.AUTO);
// 预取数量
containerFactory.setPrefetchCount(1);
//并发消费者数量
containerFactory.setConcurrentConsumers(1);
//最大的并发消费者数量
containerFactory.setMaxConcurrentConsumers(1);
return containerFactory;
}
4.使用@RabbitListener对某个队列实施监听,进行消息处理
使用json作为序列化协议
发送端:
@Bean
public RabbitTemplate rabbitTemplate(RabbitTemplateConfigurer configurer, ConnectionFactory connectionFactory) {
RabbitTemplate template = new RabbitTemplate();
configurer.configure(template, connectionFactory);
//使用json作为序列化协议
template.setMessageConverter(new Jackson2JsonMessageConverter());
return template;
}
接收端:
//设置使用json反序列化
containerFactory.setMessageConverter(new Jackson2JsonMessageConverter());
确认机制
生产确认:
- 开启确认
spring:
application:
name: mq52publisher
rabbitmq:
# 开启生产确认
publisher-confirm-type: correlated
- 回调,新建一个类实现 RabbitTemplate.ConfirmCallback
a. 将该实现类作为Springbean注入到rabbitTemplate中 - 确认消息的唯一标志,在rabbitTemplate.convertAndSend最后一个参数为CorrelationData,可以放入ID
消费确认: ACK
4. 取消autoACK containerFactory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
5. 在接受的Listener中加入channel和deliveryTag
@RabbitListener(queues = "ticket.user.reg.queue")
public void doAfterRegSuccess(UserRegMSG userRegMSG, Channel channel,
@Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) throws IOException {
死信队列
1.额外配置 死信交换机、队列、绑定,指定正常队列的死信队列和rk
Map<String,Object> arguments = new HashMap<>();
// 指定该队列的死信交换机和路由键
arguments.put("x-dead-letter-exchange",DEAD_EXCHANGE);
arguments.put("x-dead-letter-routing-key",DEAD_RK);
return new Queue(USER_REG_QUEUE,true,false,false,arguments);
2.发送时修改配置,指定ttl
rabbitTemplate.convertAndSend(
MQConfig.USER_EXCHANGE,
MQConfig.USER_REG_RK,
userRegMSG,
message -> {
MessageProperties properties = message.getMessageProperties();
//投递模式
properties.setDeliveryMode(MessageDeliveryMode.PERSISTENT);
//过期时间
properties.setExpiration(""+60*1000);
//设置ID
properties.setCorrelationId(id);
return message;
});
3.修改监听,为监听死信队列