其实我没有让它运行。也许我误会了一些东西,但这是不可能的。我正在尝试在一个相同的队列,相同的交换上配置2个侦听器,但只有路由密钥应该不同。我的问题是,事情以某种方式弄乱了。结果是,侦听器A获得了针对侦听器B的消息。但是,只有在某些情况下,有时一切正常。有什么建议么?

我的配置

@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

@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

@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个消费者。
提前谢谢!

最佳答案

RabbitMQ不能那样工作;与JMS不同,无法从队列中选择消息(例如,基于路由键)。

您所做的全部工作是使用2个不同的路由密钥将同一队列绑定到交换。因此,是的,无论它如何到达队列,任何一个侦听器都将获得该消息。

使用RabbitMQ,每个侦听器都需要一个单独的队列。当生产者发布到交换时,代理将根据他使用的路由密钥来将消息路由到正确的队列。

如果每个侦听器有多个实例,则将相应地分发消息(每个队列仅传送一次)。

关于java - spring amqp注解驱动一个队列,两个监听器区分路由键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41817062/

10-16 21:51