С условием для аннотации StreamListener, если это условие не выполняется, DispatchingStreamListenerMessageHandler регистрирует сообщение WARN с текстом:
Cannot find a @StreamListener matching for message with id: [some_id]
Пример, представьте, что у нас есть 3 микросервиса:
- AnimalService - приложение-производитель, которое будет выдавать сообщения Dog и Cat .
- DogService - приложение-потребитель, которое будет принимать только сообщения Dog .
- CatService - потребительское приложение, для приема только сообщений Cat .
Приложение Animal отправляет сообщение и включает параметр заголовка 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, и наоборот, каждая служба будет иметь в журнале сообщение ПРЕДУПРЕЖДЕНИЕ, например:
Cannot find a @StreamListener matching for message with id: [some_id]
Я нашел два решения, как этого избежать, но они, вероятно, не лучший.
- создать в DogService еще один @StreamListener, который будет фиксировать события Cat и делать там какие-либо логи c, просто зарегистрируйте отладочное сообщение
- Измените уровень журнала для org. Springframework.cloud.stream.binding для ERROR, но это может привести к пропуску некоторых важных сообщений WARN в журналах.
Я использую spring-cloud-stream-3.0.3.
Есть ли другой лучший вариант (свойство конфигурации)? Или нет другого варианта, скорее, рефакторинг моих услуг? Спасибо.