Java 如何侦听动态创建的队列?
我有一个rabbitListener,它连续异步地侦听队列“用户消息”的用户消息。除非队列中加载了大量消息,否则一切都正常。当消息批量发布到队列中时,同一用户的消息首先被处理,从而其他用户的消息等待轮到他们 我不能使用优先级队列,因为所有用户的优先级都相同。因此,我想创建新队列,并在运行时收听它们。一旦消息被使用,所有队列都将是短暂的。(队列将被删除) 浏览时,我发现可以使用RabbitAdmin动态创建队列。但问题是Java 如何侦听动态创建的队列?,java,rabbitmq,amqp,spring-amqp,spring-rabbit,Java,Rabbitmq,Amqp,Spring Amqp,Spring Rabbit,我有一个rabbitListener,它连续异步地侦听队列“用户消息”的用户消息。除非队列中加载了大量消息,否则一切都正常。当消息批量发布到队列中时,同一用户的消息首先被处理,从而其他用户的消息等待轮到他们 我不能使用优先级队列,因为所有用户的优先级都相同。因此,我想创建新队列,并在运行时收听它们。一旦消息被使用,所有队列都将是短暂的。(队列将被删除) 浏览时,我发现可以使用RabbitAdmin动态创建队列。但问题是 如何使我的侦听器侦听在运行时创建的新短期(TTL)队列 如何使侦听器停止侦听
@Bean
public SimpleRabbitListenerContainerFactory myRabbitListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(config.getConnectionFactory());
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
factory.setConcurrentConsumers(1);
factory.setMaxConcurrentConsumers(3);
return factory;
}
@RabbitListener(id = "listener", queues = {
"#{receiver.queues()}" }, containerFactory = "myRabbitListenerContainerFactory")
public void listen(QueueMessage message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag,
MessageHeaders headers) {
//process message
}
[1]: https://www.rabbitmq.com/event-exchange.html
这个怪人似乎正是这么做的=> 链接中的代码:
- rabbitMQ配置
@配置
公共类RabbitMqConfiguration实现RabbitListenerConfigurer{
@自动连线
私有连接工厂连接工厂;
@豆子
公共Jackson2JsonMessageConverter生产商Ackson2MessageConverter(){
返回新的Jackson2JsonMessageConverter();
}
@豆子
公共映射Jackson2MessageConverter使用者Ackson2MessageConverter(){
返回新的MappingJackson2MessageConverter();
}
@豆子
公共的rabbitmplate rabbitmplate(){
最终RabbitTemplate RabbitTemplate=新RabbitTemplate(连接工厂);
setMessageConverter(producerJackson2MessageConverter());
返回兔模板;
}
@豆子
公共RabbitAdmin RabbitAdmin(){
返回新的RabbitAdmin(连接工厂);
}
@豆子
公共RabbitListenerEndpointRegistry RabbitListenerEndpointRegistry(){
返回新的RabbitListenerEndpointRegistry();
}
@豆子
public DefaultMessageHandlerMethodFactory messageHandlerMethodFactory(){
DefaultMessageHandlerMethodFactory=新的DefaultMessageHandlerMethodFactory();
setMessageConverter(consumerJackson2MessageConverter());
返回工厂;
}
@豆子
public MessageConverter jsonMessageConverter(){
返回新的Jackson2JsonMessageConverter();
}
@凌驾
public void configureRabbitListeners(最终RabbitListenerEndpointRegistrator){
SimpleRableBitListenerContainerFactory=新SimpleRableBitListenerContainerFactory();
工厂设置预取计数(1);
出厂设置连续激活触发器(1);
工厂设置连续事件触发器(1);
工厂。设置连接工厂(连接工厂);
setContainerFactory(工厂)注册处;
setEndpointRegistry(rabbitListenerEndpointRegistry());
setMessageHandlerMethodFactory(messageHandlerMethodFactory());
}
}
- 接口
公共接口RabbitQueueService{
void addNewQueue(String queueName、String exchangeName、String routingKey);
void addQueueToListener(字符串listenerId,字符串queueName);
void removeQueueFromListener(字符串listenerId,字符串queueName);
布尔checkQueueExistOnListener(字符串listenerId,字符串queueName);
}
- 服务
@服务
@Log4j2
公共类RabbitQueueServiceImpl实现RabbitQueueService{
@自动连线
私人兔管理员兔管理员;
@自动连线
私有RabbitListenerEndpointRegistry RabbitListenerEndpointRegistry;
@凌驾
public void addNewQueue(字符串queueName、字符串exchangeName、字符串routingKey){
Queue Queue=新队列(queueName,true,false,false);
绑定=新绑定(
队列名称,
Binding.DestinationType.QUEUE,
交换名称,
路由键,
无效的
);
rabbitAdmin.declareQueue(队列);
rabbitAdmin.declareBinding(绑定);
this.addQueueToListener(exchangeName,queueName);
}
@凌驾
public void addQueueToListener(字符串listenerId,字符串queueName){
log.info(“将队列:+queueName+”添加到id为:+listenerId的侦听器);
if(!checkQueueExistOnListener(listenerId,queueName)){
this.getMessageListenerContainerByd(listenerId).addQueueNames(queueName);
log.info(“队列”);
}否则{
log.info(“给定的队列名称:+queueName+”在给定的侦听器id:+listenerId上不存在);
}
}
@凌驾
public void removeQueueFromListener(字符串listenerId,字符串queueName){
log.info(“正在从侦听器中删除队列:+queueName+”:+listenerId);
if(checkQueueExistOnListener(listenerId,queueName)){
this.getMessageListenerContainerByd(listenerId).removeQueueNames(queueName);
log.info(“从兔子管理中删除队列”);
this.rabbitAdmin.deleteQueue(queueName);
}否则{
log.info(“给定的队列名称:+queueName+”在给定的侦听器id:+listenerId上不存在);
}
}
@凌驾
公共布尔checkQueueExistOnListener(字符串listenerId,字符串queueName){
试一试{
log.info(“正在检查侦听器id:+listenerId上是否存在queueName:+queueName+”);
log.info(“获取队列名称”);