首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >spring ampq注解驱动一个队列两个监听器区分路由关键字

spring ampq注解驱动一个队列两个监听器区分路由关键字
EN

Stack Overflow用户
提问于 2017-01-24 06:47:39
回答 1查看 1.4K关注 0票数 2

实际上,我不能让它运行。也许我误解了什么,这无论如何都是不可能的。我正在尝试在同一个队列上配置两个监听器,相同的交换,但只有路由关键字应该不同。我的问题是,不知何故,事情变得一团糟。结果是监听器A收到了发往监听器B的消息。但只是有时,有时一切都很正常。有什么建议吗?

MyConfig

代码语言:javascript
复制
@Bean
public ConnectionFactory connectionFactory() {
    CachingConnectionFactory connectionFactory = new CachingConnectionFactory(getHostname());
    connectionFactory.setUsername(getUsername());
    connectionFactory.setPassword(getPassword());
    return connectionFactory;
}

@Bean
public RabbitAdmin rabbitAdmin() {
    return new RabbitAdmin(connectionFactory());
}

@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    factory.setMessageConverter(new CustomMessageConverter());
    factory.setConnectionFactory(connectionFactory());
    factory.setAcknowledgeMode(AcknowledgeMode.AUTO);
    factory.setConcurrentConsumers(10);
    factory.setMaxConcurrentConsumers(10);
    return factory;
}

@Override
public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) {
    registrar.setMessageHandlerMethodFactory(myHandlerMethodFactory());
}

@Bean
public DefaultMessageHandlerMethodFactory myHandlerMethodFactory() {
    DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();
    factory.setMessageConverter(new MappingJackson2MessageConverter());
    return factory;
}

MyListeners A

代码语言:javascript
复制
@RabbitListener(bindings = @QueueBinding(value = @Queue(value = QUEUE, durable = "true"), exchange = @Exchange(value = EXCHANGE, type = "topic", durable = "true", ignoreDeclarationExceptions = "true"), key = "routingKeyA"))
public String myListenerA(@Payload PayloadA payload, @Header(AmqpHeaders.CORRELATION_ID) byte[] correlationId) { 

    return SUCCESS_RESPONSE;
}

MyListener B

代码语言:javascript
复制
@RabbitListener(bindings = @QueueBinding(value = @Queue(value = QUEUE, durable = "true"), exchange = @Exchange(value = EXCHANGE, type = "topic", durable = "true", ignoreDeclarationExceptions = "true"), key = "routingKeyB"))
public String myListenerB(@Payload PayloadB payload, @Header(AmqpHeaders.CORRELATION_ID) byte[] correlationId) { 

    return SUCCESS_RESPONSE;
}

附加信息:我在这个队列中有20个消费者。提前谢谢你!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-24 08:46:17

RabbitMQ不是以这种方式工作的;与JMS不同的是,无法从队列中选择消息(例如,基于路由关键字)。

您所做的就是使用2个不同的路由键将相同的队列绑定到交换。所以,是的,无论消息是如何到达队列的,任何一个监听器都会得到消息。

使用RabbitMQ,您需要为每个监听器创建一个单独的队列。当生产者发布到交换时,代理将根据他使用的路由关键字将消息路由到正确的队列。

如果每个监听程序都有多个实例,则会相应地分发消息(每个队列只有一次传递)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41817062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档