代码之家  ›  专栏  ›  技术社区  ›  Rando Shtishi

Spring Boot应用程序不使用队列消息

  •  0
  • Rando Shtishi  · 技术社区  · 2 年前

    我有Rabbit MQ代理,用于在服务之间异步通信。 服务A 正在向队列发送消息。我检查了队列,来自服务A的消息已经到达: enter image description here

    我正试图在 服务B 为了使用服务A产生的消息,我如下所述进行了验证,以检查服务B是否与RabbitMQ连接,并且似乎连接成功。

    enter image description here

    问题是服务B已成功启动,但它正在接收来自Rabbit MQ的消息。

    以下是侦听器的实现:

    @Slf4j
    @Component
    public class EventListener {
    
        public static final String QUEUE_NAME = "events";
    
        @RabbitListener(
                bindings = {
                        @QueueBinding(
                                value = @Queue(QUEUE_NAME),
                                exchange = @Exchange("exchange")
                        )
    
                }
        )
        public void handleTaskPayload(@Payload String payload) {
            System.out.println(payload);
        }
    }
    

    我在Rabbit MQ中验证了队列和交换信息,它们是正确的。

    enter image description here

    一切都正常工作,服务A或服务B中没有出现任何错误,这使得这个问题更难调试。

    我试图从RabbitMQ的队列getMessage中检索消息,消息如下:

    {"id":"1",:"name:"Test","created":null}
    

    我将感谢为解决这一问题提供的任何帮助或指导。

    顺致敬意, Rando。

    附笔

    我创建了一个新的测试队列,如下所示,并发布了一些消息:

    enter image description here

    enter image description here

    修改了如下侦听器代码,但仍然无法触发侦听器侦听队列事件:

    @Slf4j
    @Component
    public class RobotRunEventListener {
    
        public static final String QUEUE_NAME = "test";
    
        @RabbitListener(
                bindings = {
                        @QueueBinding(
                                value = @Queue(QUEUE_NAME),
                                key = "test",
                                exchange = @Exchange("default")
                        )
    
                }
        )
        public void handleTaskPayload(@Payload String payload) {
            System.out.println(payload);
        }
    
    0 回复  |  直到 2 年前
        1
  •  0
  •   Michael McFadyen Roberto Trujillo    2 年前

    尝试这种方法:

     @RabbitListener(queues = "test")
     public void receive(String in, @Headers Map<String, Object> headers) throws IOException  {
     }
    
        2
  •  0
  •   Rando Shtishi    2 年前

    问题是我正在开发的spring-boot应用程序有一个 @Conditional(Config.class) 阻止了以下bean的创建:

    @Slf4j
    @Conditional(Config.class)
    @EnableRabbit
    public class InternalRabbitBootstrapConfiguration {
        @Bean
        public RabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
            SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
            factory.setConnectionFactory(connectionFactory);
            factory.setMaxConcurrentConsumers(5);
            return factory;
        }
    ...
    

    这导致spring引导应用程序未侦听Rabbit MQ事件。Config.class需要特定的配置文件才能使应用程序侦听Rabbit MQ事件。

    public class DexiModeCondition implements Condition {
    
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
    
            String[] activeProfiles = context.getEnvironment().getActiveProfiles();
    
            return activeProfiles[0].equalsIgnoreCase(mode);
        }
    }