如果不满足条件,如何避免有条件@StreamListener的WARN日志?

问题描述 投票:0回答:1

使用StreamListener注释的条件,如果不满足此条件,DispatchingStreamListenerMessageHandler将记录带有文本的WARN消息:

Cannot find a @StreamListener matching for message with id: [some_id]

示例,假设我们有3个微服务:

  • AnimalService-生产者应用程序,它将产生DogCat消息。
  • DogService-使用者应用程序,仅使用Dog消息。
  • CatService-使用者应用程序,仅使用Cat消息。

动物应用程序正在发送消息,并包含头参数type

public void handleEvent(Animal animal) {
    MessageBuilder<Animal> messageBuilder = MessageBuilder.withPayload(animal)
        .setHeader("type", animal.getType());
    bindings.itemEventOutput().send(messageBuilder.build());
}

DogService和CatService都将使用此消息。显然,DogService仅希望使用“ Dog”消息,而CatService仅希望使用“ Cat”消息。

DogService将像这样消耗:

@StreamListener(target = "animal_events", condition = "headers['type']=='DOG'")
public void handleDogEvents(Message<String> message) {
    //important dog related logic
}

CatService将像这样消耗:

@StreamListener(target = "animal_events", condition = "headers['type']=='CAT'")
public void handleCatEvents(Message<String> message) {
    //important cat related logic
}

因为DogService无法处理与Cat相关的消息,反之亦然,每个服务都将在日志WARN消息中包含以下内容:

Cannot find a @StreamListener matching for message with id: [some_id]

我找到了两种解决方案来避免这种情况,但是它们可能不是最好的。

  1. 在DogService中创建另一个@StreamListener,它将捕获Cat事件并在那里执行任何逻辑,只需记录一条调试消息即可
  2. 将org.springframework.cloud.stream.binding软件包的日志级别更改为ERROR,但这可能导致在日志中丢失一些重要的WARN消息。

我正在使用spring-cloud-stream-3.0.3。

还有其他更好的选择(配置属性)吗?还是没有其他选择可以重构我的服务?谢谢。

spring spring-cloud-stream
1个回答
0
投票

s-c-stream的注释编程模型几乎已被弃用。在过去的一年中,我们一直在推广函数式编程模型,该模型可提供更强大的routing mechanism

© www.soinside.com 2019 - 2024. All rights reserved.