Как избежать журналов WARN для условного @StreamListener, если условие не выполняется? - PullRequest
0 голосов
/ 16 апреля 2020

С условием для аннотации 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]

Я нашел два решения, как этого избежать, но они, вероятно, не лучший.

  1. создать в DogService еще один @StreamListener, который будет фиксировать события Cat и делать там какие-либо логи c, просто зарегистрируйте отладочное сообщение
  2. Измените уровень журнала для org. Springframework.cloud.stream.binding для ERROR, но это может привести к пропуску некоторых важных сообщений WARN в журналах.

Я использую spring-cloud-stream-3.0.3.

Есть ли другой лучший вариант (свойство конфигурации)? Или нет другого варианта, скорее, рефакторинг моих услуг? Спасибо.

1 Ответ

0 голосов
/ 18 апреля 2020

Модель программирования аннотации для s- c -stream почти устарела. В прошлом году мы продвигали модель функционального программирования, которая обеспечивает более надежный механизм маршрутизации .

. Я также опубликовал пост с более подробной информацией здесь . Надеюсь, это поможет.

...