繁体   English   中英

Spring 启动应用程序不使用队列消息

[英]Spring Boot App not consuming queue messages

我有用于在服务之间进行异步通信的 Rabbit MQ 代理。 服务 A正在向队列发送消息。 我检查了队列,来自服务 A 的消息已经到达: 在此处输入图像描述

我正在尝试在服务 B中创建一个侦听器以使用服务 A 生成的消息。我如下验证以检查服务 B 是否与 RabbitMQ 连接并且它似乎已成功连接。

在此处输入图像描述

问题是服务 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 中的队列和交换信息,它们是正确的。

在此处输入图像描述

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

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

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

对于解决此问题的任何帮助或指导,我将不胜感激。

最好的问候,兰多。

聚苯乙烯

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

在此处输入图像描述

在此处输入图像描述

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

@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);
    }

试试这个方法:

 @RabbitListener(queues = "test")
 public void receive(String in, @Headers Map<String, Object> headers) throws IOException  {
 }

问题是我正在处理的 spring 引导应用程序有一个@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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM