使用PollableChannel时的Spring集成错误通道

时间:2016-11-02 08:48:47

标签: java spring-integration

我们在我的应用程序中使用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
     }
}

1 个答案:

答案 0 :(得分:3)

  

但是当处理方法抛出异常时,它不会被重定向到错误通道。

当网关方法返回void时,调用线程在返回网关时立即释放。

在这种情况下,网关不会添加错误通道标头(在下一个版本 - 5.0中),我们有changed that

与此同时,您可以使用标头扩充器将errorChannel标头设置为错误通道。您还可以使用defaultHeaders上的@MessagingGateway媒体资源 - 查看this answer上的评论。