spring boot 整合rabbitmq遇到的问题

1.重复报错 connection reset

根据connection reset的含义为服务端基于一定的原因关闭连接,客户端仍在发送导致的,结合百度判断为配置的帐号没有queue的访问权限导致,登陆manager修改对应权限。

2.rabbitTemplate注入为null

在控制器中直接使用new sender的实例进行测试,一直发现 rabbitTemplate一直没有自动注入,后经过对比发现问题,之前在netty整合时就出现这样的问题,以后需更加注意。


3.rabbitmq的基本概念

rabbitmq 有两部分组成 :queue,exchange ,其中queue必须绑定到exchange上才有意义,才会被路由,exchange有三种工作模式或者叫匹配方式 

3.1直接匹配 对应convertAndSend("queuename", context); 这种模式下没有exchange参数,会从Default exchange binding这个默认的exchange上寻找对应的queue(所有的queue都默认绑定这个exchange)

3.2fanout 组播模式 BindingBuilder.bind(AMessage).to(fanoutExchange);直接绑定queue到exchange的且不带参数的情况下,所有发送至该exchange的消息都会路由到该队列这种模式被称为fanout,对应发送 convertAndSend("fanoutExchange","", context);第二个参数在这种情况下没有意义。

3.3 上述3.2的模型的绑定方式加上with参数的话,比如BindingBuilder.bind(queueMessage).to(exchange).with("topic.fliter")在这种模式下,exchange不再将所有消息路由至对应的队列,而是通过routekey进行匹配后发送。

从springboot的角度来说,其实没有上述这些概念了,通过send,与bind的不同组合实现了上述组合。


4.虚拟主机的概念

主要是用来多个应用直接进行权限管理,命名隔离用的。

5.延迟队列

现实总存在很多需求,处理完一个事件多久后做什么,比如订单签收后3天后自动确认收货等,rabbitmq利用deadLetter队列解决了该问题,其基本思路是设置一个队列为某个exchange的deadletter队列,那么发送到该队列的消息都不会被处理,最后会超时出发对应deadletter的超时路由,超时路由根据消息即可进行处理。

关键代码:

arguments.put("x-dead-letter-exchange", "dlexchange"); 设置为exchange的dead-letter.

arguments.put("x-dead-letter-routing-key", "ontimeout"); 设置触发超时转发队列



发送部分代码

MessagePostProcessor processor = new MessagePostProcessor(){
@Override
public Message postProcessMessage(Message message) throws AmqpException {
message.getMessageProperties().setExpiration(times + "");
return message;
}
};

rabbitTemplate.convertAndSend("dlexchange","dlqueue", "testmessage", processor);

测试经过 times 时间后ontimeout队列收到消息。

参考https://blog.csdn.net/i_vic/article/details/72742277





猜你喜欢

转载自blog.csdn.net/w18637468680/article/details/79742675