Spring Cloud Stream: глобальный errorChannel не работает - PullRequest
1 голос
/ 21 июня 2019

Согласно этой документации , должна быть возможность подписаться на канал глобальной ошибки, предоставляемый Spring Integration - "errorChannel".

В моем очень простом случае это не работает:

Применение:

@SpringBootApplication
@EnableBinding({MySink.class})
public class LoggingConsumerApplication {

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

    @StreamListener(target = MySink.INPUT_ONE)
    public void handle(Person person) {
        System.out.println("Received: " + person);

        if(StringUtils.isEmpty(person.getName())){
            throw new RuntimeException("Wrong person name!");
        }
    }

    @ServiceActivator(inputChannel = "mySink.mySink-group.errors")
    public void error(Message<?> message) {
        System.out.println("Handling ERROR: " + message);
    }


    @ServiceActivator(inputChannel = "errorChannel")
    public void errorGlobal(ErrorMessage message) {
        System.out.println("Handling ERROR GLOBAL SA: " + message);
    }

    @StreamListener("errorChannel")
    public void errorGlobalListener(ErrorMessage message) {
        System.out.println("Handling ERROR GLOBAL Listener: " + message);
    }

    public static class Person {
        private String name;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String toString() {
            return this.name;
        }
    }
}

MySink

public interface MySink {

    /**
     * Input channel name.
     */
    String INPUT_ONE = "inputOne";

    /**
     * @return input channel.
     */
    @Input(MySink.INPUT_ONE)
    SubscribableChannel inputOne();
}

свойства

spring.rabbitmq.host=192.168.0.100
spring.cloud.stream.bindings.inputOne.destination=mySink
spring.cloud.stream.bindings.inputOne.group=mySink-group

Работает специфичный для места назначения обработчик (mySink.mySink-group.errors), но два других обработчика так и не вызываются.

Что здесь не так?

Попробовал с пружинной загрузкой 2.1.6

1 Ответ

1 голос
/ 21 июня 2019

В этом нет ничего плохого, и он работает, как ожидалось. Из документа doc: "Метод handle (..), который подписывается на канал с именем input, выдает исключение. Поскольку имеется также подписчик на канал ошибок input.myGroup.errors, все сообщения об ошибках обрабатываются этим subscriber. " Итак, это означает, что ваша ошибка обрабатывается либо привязывающим специфическим обработчиком ошибок (mySink.mySink-group.errors), либо глобальным (errorChannel).

https://cloud.spring.io/spring-cloud-static/spring-cloud-stream/2.2.0.RELEASE/spring-cloud-stream.html#spring-cloud-stream-overview-error-handling

...