簡體   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