Невозможно подписаться на глобальный errorChannel - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть два приложения, которые генерируют сообщения друг на друга, используя Spring Cloud stream и rabbitmq binder.Я не могу подписаться на канал глобальной или выделенной ошибки.Я уверен, что пропускаю одну из молитв аннотации к одному из богов рамок Весны.

Я попытался упростить код до следующего.(Код также доступен на https://github.com/achintmehta/springclouddemo)

. В следующем коде я пытаюсь отправить сообщение на канал INPUT и возвращаю сообщение на канале OUTPUT. Приемник потока для канала INPUT выдает исключение, и я вижуlogHandler печатает исключение, но ни одна из моих зарегистрированных конечных точек для ошибок не вызывается.

    public static void main(String[] args) {
        SpringApplication.run(SprintclouddemoApplication.class, args);
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        // Send a message to INPUT Channel
        System.out.println("****************** Inside run method *********************");
        source.input().send(
                        MessageBuilder
                       .withPayload("ACTIVE")
                           .build());
    }

    @StreamListener(Processor.INPUT)
    @SendTo(Processor.OUTPUT)  // Send back the response to OUTPUT channel
    public String requestReceived(
            String state) {
        // Receive message on input channel
        System.out.println("****************** Received event *********************");
        // Throw exception
        throw new RuntimeException("!!!!! ABORT ABORT !!!!!");
        //return "Event received";
    }

    @StreamListener(Processor.OUTPUT)
    public void responseReceived(Message<?> message) {
        // Listen for message on OUTPUT channel
        System.out.println("******************* ACK received as : " + message);
    }

    @ServiceActivator(inputChannel="errorChannel")
    public ErrorMessage onError(ErrorMessage message) {
        // THIS FUNCTION NEVER GETS CALLED WHEN EXCEPTION HAPPENS
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Received ERROR: " + message);
        return message;
    }

    @StreamListener("errorChannel")
    public void error(Message<?> message) {
        // THIS FUNCTION NEVER GETS CALLED WHEN EXCEPTION HAPPENS
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Handling ERROR: " + message);
    }




Ниже приведен мой файл application.yml

 spring:
  application:
    name: cloudstream-demo

  rabbitmq:
    host: rabbitmq
    port: 5672
    username: guest
    password: guest

  cloud:
    stream:
      bindings:
        input:
          destination: stateChangeTopic
          content-type: application/json
          group: stateChangeGroup
        output:
          destination: stateChangeRspTopic
          content-type: application/json
          group: stateChangeRspGroup

Выходные журналы также находятся в github на следующемссылка: https://github.com/achintmehta/springclouddemo/blob/master/logs.txt

1 Ответ

1 голос
/ 03 апреля 2019

Есть несколько вещей, которые не так с вашим приложением

  1. Почему вы вводите процессор в свое приложение?Я имею в виду, что цель всего этого - дать сигнал каркасу для создания необходимых привязок, чтобы соединить / отобразить локальные каналы с удаленными пунктами назначения (Кафка, Кролик и т. Д.).Это означает, что когда вы отправляете сообщение на канал input напрямую, вы полностью обходите среду Spring-cloud-stream и все ее функции, включая обработку ошибок, преобразование сообщений, повторные попытки и т. Д. В основном в этот момент вы находитесьпросто НЕ используя spring-cloud-stream.Когда вы генерируете исключение, оно передается обратно исходному вызывающему.В случае spring-cloud-stream исходный вызывающий объект является контейнером прослушивания сообщений, который перехватывает исключение, делает повторные попытки и затем проходит процедуру обработки ошибок , включая отправку в канал (ы) ошибок.В вашем случае исходный абонент - это вы через source.input().send(...), а не через каркас.

  2. Подпись здесь неверна: @ServiceActivator(inputChannel="errorChannel") public ErrorMessage onError(ErrorMessage message).Возвращая что-либо кроме void каковы ваши ожидания?Куда пойдет ErrorMessage?

...