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