Spring Cloud Stream:全局errorChannel不起作用

时间:2019-06-20 21:05:14

标签: spring-boot spring-integration messaging spring-cloud-stream

根据此documentation,应该可以订阅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),但是从未调用过其他两个处理程序。

这是怎么了?

尝试过Spring Boot 2.1.6

1 个答案:

答案 0 :(得分:1)

没有任何问题,它按预期运行。从文档中:“订阅名为输入的通道的handle(..)方法会引发异常。给错误通道input.myGroup.errors提供一个订阅者,所有错误消息均由此方法处理订阅者”。因此,这意味着您的错误是通过绑定特定的错误处理程序(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