我们在我的应用程序中使用Spring集成。我想将一些对象放入通道进行异步处理和错误处理。因此,为此我配置了MessageGateway
错误通道和PollableChannel
来处理要处理的对象。
所以我正在呼叫messageGateway.processMessage(message)
将消息放入频道。这按预期工作 - 调用此方法是非阻塞的,消息被处理并转发到下一个通道。但是当处理方法抛出异常时,它不会被重定向到错误通道。
另一方面,当我将处理频道从PollableChannel
更改为SubscribableChannel
时,错误频道按预期工作,但调用网关当然是阻止的。我错过了什么?我可以同时拥有非阻塞呼叫和错误通道吗?
执行消息处理的组件:
@Component
public MessageProcessor {
@Transactional
@ServiceActivator(inputChannel = "msg.process", outputChannel = "msg.postprocess")
public void processMessage(MyMessage message) {
// Message processing that may throw exception
}
}
频道定义:
@Configuration
public class IntegrationConfig {
@Bean(name = "msg.process")
private MessageChannel processChannel() {
return new RendezvousChannel();
}
@Bean(name = "msg.error")
private MessageChannel errorChannel() {
return new DirectChannel();
}
}
我的网关看起来像这样:
@MessagingGateway(errorChannel = "msg.error")
public interface MessagingGateway {
@Gateway(requestChannel = "msg.processing")
void processMessage(MyMessage message);
}
错误处理程序:
@Component
public ErrorHandlers {
@Transactional
@ServiceActivator(inputChannel = "msg.error")
public void processError(MessagingException me) {
// Error handling is here
}
}
答案 0 :(得分:3)
但是当处理方法抛出异常时,它不会被重定向到错误通道。
当网关方法返回void时,调用线程在返回网关时立即释放。
在这种情况下,网关不会添加错误通道标头(在下一个版本 - 5.0中),我们有changed that。
与此同时,您可以使用标头扩充器将errorChannel
标头设置为错误通道。您还可以使用defaultHeaders
上的@MessagingGateway
媒体资源 - 查看this answer上的评论。