当我使用publishSubscribeChannel的taskExecutor时如何设置errorChannel?

时间:2019-09-02 07:40:55

标签: spring spring-integration spring-dsl

我使用了publishSubscribeChannel并添加了taskExecutor来实现异步。

下面是代码。

@Bean
public IntegrationFlow mainFlow(){
    return IntegrationFlows.from("mainFlow")
            ..
            .publishSubscribeChannel(subFlowTaskExecutor, subscribe->{
                subscribe.subscribe(flow->
                        flow.channel("testFlow")); })
            ..
            .enrichHeaders(c->c.header(HttpHeaders.STATUS_CODE,HttpStatus.OK))
            .get();
}

@Bean
public IntegrationFlow testFlow (){
    return IntegrationFlows.from("testFlow")
            .handler(handlerSomeThing())
            .get();
}

如您所见,mainFlow为testFlow。 现在,我想实现一个errorChannel来处理testFlow异常。 那么什么是好的方法呢?

我试图使用这种方式,实现一个ErrorHandler并设置为subscription。但是还有其他方法吗?

private TestErrorHandler errorHandler;

@Bean
public IntegrationFlow mainFlow(){
    return IntegrationFlows.from("mainFlow")
            ..
            .publishSubscribeChannel(subFlowTaskExecutor, subscribe->{
                subscribe.errorHandler(errorHandler);
                subscribe.subscribe(flow->
                        flow.channel("testFlow")); })
            ..
            .enrichHeaders(c->c.header(HttpHeaders.STATUS_CODE,HttpStatus.OK))
            .get();
}

@Component

公共类TestErrorHandler实现ErrorHandler {

@Autowired
private MessagingTemplate messagingTemplate;

@Autowired
@Qualifier(RTSChannel.PerformNameScreening.ERROR_CHANNEL)
private MessageChannel errorChannel;

@Override
public void handleError(Throwable throwable) {
    messagingTemplate.send(errorChannel,new ErrorMessage(throwable));
}

@Bean
public MessagingTemplate errorMessagingTemplate(){
    return new MessagingTemplate();
}

}

1 个答案:

答案 0 :(得分:0)

@Bean
public IntegrationFlow mainFlow(){
    return IntegrationFlows.from("mainFlow")

您不能拥有与流中第一个频道同名的流。假设你的意思

@Bean
public IntegrationFlow mainFlow(){
    return IntegrationFlows.from("mainFlowChannel")

通常,错误通道将位于mainFlowChannel上游的某个组件上。

如果要在子流中确定错误处理的范围,则需要在其中使用.gateway()

            .publishSubscribeChannel(subFlowTaskExecutor, subscribe-> flow->
                        flow.gateway(testFlow(), g -> g.errorChannel("errorFlowInputChannel)))