使用StreamListener注释的条件,如果不满足此条件,DispatchingStreamListenerMessageHandler将记录带有文本的WARN消息:
Cannot find a @StreamListener matching for message with id: [some_id]
示例,假设我们有3个微服务:
动物应用程序正在发送消息,并包含头参数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]
我找到了两种解决方案来避免这种情况,但是它们可能不是最好的。
我正在使用spring-cloud-stream-3.0.3。
还有其他更好的选择(配置属性)吗?还是没有其他选择可以重构我的服务?谢谢。
s-c-stream的注释编程模型几乎已被弃用。在过去的一年中,我们一直在推广函数式编程模型,该模型可提供更强大的routing mechanism。