java rabbitmq 发送消息是topic模式, 消费者 怎么消费多个不同名字的队列?
这里有几个不同的队列 名字没有什么规则 就是xxx.xxx exchange也是和队列的名字一样的
package com.monitor.receiver.queue;import java.util.List;
import java.util.Map;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.retry.annotation.Recover;
import org.springframework.stereotype.Component;
import com.monitor.receiver.jpush.PushUtil;
import com.monitor.receiver.pojo.SysWarnInfo;
import com.monitor.receiver.service.SysWarnInfoService;
@Recover
@Component
public class Receive {
@Autowired
SysWarnInfoService sysWarnInfoService;
@RabbitListener(queues="Adine.One")
public void process_sys_warn1(Map msg) {
if(msg!=null){
List< SysWarnInfo>list=sysWarnInfoService.findAccountList(msg);
PushUtil.jiguangPush(list);
}
}
@RabbitListener(queues="lous.wqui")
public void process_sys_warn2(Map msg) {
if(msg!=null){
List< SysWarnInfo>list=sysWarnInfoService.findAccountList(msg);
PushUtil.jiguangPush(list);
}
}
}
向上面的消费者 写了两个监听,根据队列名 监听指定的队列。 但是现在队列是动态生成的 根本不知道有多少个队列,也不知道队列名字 反正队列名生成规则就是XXX.XXX(用户名.xxx类型)。 能不能只写一个消费去消费此mq服务器所有的队列? 像那种#.# 怎么配置的 就是消费所有的意思 怎么消费所有?
回答:
题主先要明白 exchange的概念及其对应的几种类型和routingKey的概念。
如果不依赖于任何插件的话,我目前的答案是不能。原因如下:
1、rabbit是生产者消费者解耦合的,必须建立绑定关系,队列才能被消费
2、每条新生队列默认只有一条绑定关系,那就是发送到amq.default的exchange中的消息,会按照routingKey名称自动路由到相同名字的queue
3、你的队列是动态生成的,那说明没有新建绑定关系,只靠默认的绑定关系是做不到这一点的
另外,能不能只写一个消费去消费此mq服务器所有的队列? 这个问题是错误的,队列本来就是消费者,没有消费消费者这一说,题主的意思应该是写一个服务消费所有的rabbitmq指定exchange的消息, 这个是可以做到的。
建议题主再了解一下rabbit相关知识,欢迎再来提问
回答:
楼上的回答很赞。但是:
楼上的误会了楼主的需求。
楼主的需求应该是:
1.队列是根据某个字段动态产生,比如用户手机号。
2.同时消费两个或多个,指定手机号的队列(动态指定。。。动态。。。动态,重要的事情说三遍,举个荔枝:这次指定路由到139.....和136....., 下次指定168....、139.....和136.....)。
这种需求,单独依靠rabbitmq的exchange的routingKey是不行的。必须要通过接口,分发消息了
对于一个监听能消费所有消息的需求。。。要么你只建一个队列。。。要么,单独建一个队列,推送到其他队列的消息,都重复推送到这个队列。就相当于汇总了所有队列。
至于这种天马行空的需求,我是怎么知道的。。。。
我想说,我不仅知道这个,还知道了啥叫私密队列。对,你没看错,私密。
私密,也可以实现。。。服务端分发嘛。。。。那么,问题来了--我要这mq有何用?
哎,领导,我要离职。。。
以上是 java rabbitmq 发送消息是topic模式, 消费者 怎么消费多个不同名字的队列? 的全部内容, 来源链接: utcz.com/p/181016.html