首页 > 解决方案 > 用于异步操作配置的 Spring 集成错误通道

问题描述

我正在尝试配置一个 HttpRequestExecutingMessageHandler

    @Bean
public HttpRequestExecutingMessageHandler httpEnrollHandlerKairos() {  
    HttpRequestExecutingMessageHandler handler =  new HttpRequestExecutingMessageHandler(kairosProperties.getEnrollUrl()); 
    handler.setOutputChannel(channelConfiguration.kairosResponseChannel());
    handler.setExpectReply(true);
    handler.setMessageConverters(httpMessageConverters);
    handler.setHttpMethod(HttpMethod.POST);
    handler.setExpectedResponseType(EnrollResponse.class); 
    handler.setHeaderMapper(defaultHeaderMapper);
    return handler;
}

并具有以下流程。

public IntegrationFlow kairosEnrollFlow() { 
        return IntegrationFlows
                .from(channelConfiguration.kairosEnrollChannel())
                .<Agreement , EnrollRequest>transform(p -> transformAgreementEnrollRequest(p))
                .transform(Transformers.toJson())
                .headerFilter(httpRequestHeaderFilters())
                .enrichHeaders(m -> m.header(APP_ID, kairosProperties.getAppId()))
                .enrichHeaders(m -> m.header(APP_KEY, kairosProperties.getAppKey()))
                .handle(httpEnrollHandlerKairos())
                .get();
    }

我在此流程上为 errorChannel 放置了一个enrichHeaders,但没有结果...

我为 errorChannel 配置了一个 Autowired PS CHannel,如下所示,

@Autowired
@Qualifier("errorChannel")
private PublishSubscribeChannel errorChannel;

我的错误处理程序流程...(为方便起见,重定向到另一个 errorChannel)我的目标是为应用程序上的某些不同问题配置特定的错误通道。

@Autowired
    @Qualifier("errorChannel")
    private PublishSubscribeChannel errorChannel;

    @Autowired
    private ChannelConfiguration channelConfiguration;

    @Bean
    public IntegrationFlow errorHandlerFlow() {
        return IntegrationFlows.from(errorChannel)
        .<Message<?> , Message<ErrorMessage>>transform(m -> handleExceptionMessage(m))
        .channel(channelConfiguration.errorHandlerOutputChannel())
        .get();
    }

    public Message<ErrorMessage> handleExceptionMessage(Message<?> message)
    {
        MessagingException me = (MessagingException) message.getPayload();
        MessageHeaders mh = me.getFailedMessage().getHeaders(); 
        return MessageBuilder.withPayload(new ErrorMessage()).copyHeaders(mh).build();
    }

但是经过数百次尝试,我无法让这个 errorChannel 工作,发送方法上的应用程序会触发一个异常,并且永远不会调用 errorChannel 和配置的“errorFlow”。

我注意到应用程序处理程序正在使用 GenericMessagingTemplate ,它转而具有以下代码。

我尝试使用标头(Message 和 IntegrationUtils),而不是“ TemporaryReplyChannel tempReplyChannel = new TemporaryReplyChannel(this.throwExceptionOnLateReply); requestMessage = MessageBuilder.fromMessage(requestMessage).setReplyChannel(tempReplyChannel) .setHeader(this.sendTimeoutHeader, null) .setHeader (this.receiveTimeoutHeader, null) .setErrorChannel(tempReplyChannel).build();"。

这不会让覆盖errorChannel永远......

任何提示如何做到这一点。

有谁知道会发生什么,所有有问题的频道都是异步的。

任何澄清错误通道配置的帮助都会很高兴。

亲切的问候,

何塞·卡洛斯·卡诺瓦。

标签: javaspringintegrationchannelgateway

解决方案


推荐阅读