当前位置: 首页 > 知识库问答 >
问题:

HttpRequestExecutingMessageHandler:没有可用的输出通道或replyChannel标头

水恩
2023-03-14

我在应用程序中收到一个错误,我没有得到解决方案。应用程序请求REST/JSON并尝试与另一个应用程序通信。有一个轮询器可以异步调用每个请求。当一个do a请求总是分派错误“没有可用的输出通道或replyChannel头”,它被重定向到errorChannel句柄。

...
@Bean(name = PollerMetadata.DEFAULT_POLLER)
public PollerMetadata poller() {
    return Pollers              
            .fixedRate(NumberUtils.createLong(QUEUE_RATE))
            .get();
}

    @Bean
public MessageChannel errorChannel() {
    return MessageChannels.direct().get();
}

    @MessagingGateway 
public static interface HttpService {
    @Gateway(requestChannel = "service.input")
    void send(@Payload String body, @Headers MultiValueMap<String, String> headers);        
}


public MessageHandler httpOutboundAdapter(){
    HttpRequestExecutingMessageHandler handler = 
            Http.outboundGateway(URI, restTemplate)             
            .expectedResponseType(String.class)         
            .httpMethod(HttpMethod.POST)
            .mappedRequestHeaders("Authorization","Accept","Content-Type", "X-User-Email","X-User-Token")               
            .get();

    return handler;
}


@Bean
public FileWritingMessageHandler fileOutboundAdapter(){
    FileWritingMessageHandler fwmhs = Files
            .outboundAdapter(new File("logs/errors"))
            .autoCreateDirectory(true)
            .get();     

    return fwmhs;
}   

    @Bean
public IntegrationFlow send(){  
    return IntegrationFlows.from("service.input")
            .log(Level.DEBUG, "trace.http",
                    "'Request.\n'"+
                    ".concat('Headers : ').concat(headers.toString()).concat('\n')"+
                    ".concat('Payload : ').concat(payload.toString())"
                )                               
            .channel(MessageChannels.queue())
            .handle(this.httpOutboundAdapter()
            .transform(Transformers.toJson())
            .log(Level.DEBUG, "trace.http",
                    "'Response.\n'"+
                    ".concat('Headers : ').concat(headers.toString()).concat('\n')"+
                    ".concat('Payload : ').concat(payload.toString())"
                )
            .get();
}

    @Bean 
public IntegrationFlow errorFlow(){
    return IntegrationFlows.from(errorChannel())                                                                
                            .log(Level.DEBUG,"trace.http", "'Ocurred an error in httpResponse :'.concat(payload.message)")
                            .transform("payload.failedMessage")                             
                            .handle((p,h) -> 
                                        MessageBuilder.withPayload(new GenericMessage<>(p,h)))
                            .transform(Transformers.toJson())
                            .enrichHeaders(c -> c.headerExpression(FileHeaders.FILENAME, "'emailErrors-'.concat(headers.getTimestamp()).concat('.json')"))
                            .handle(fileOutboundAdapter())                              
                            .get();
}

日志打印:

后发送(发送=true)在通道'错误通道',消息:错误消息[有效载荷=org.springframework.messaging.消息异常:调度程序未能传递消息;嵌套异常是org.springframework.messaging.core.目标解决异常:没有可用的输出通道或回复通道标头,标头={id=826074c0-d1c6-4ecf-44f0-6da697b29f9c,时间戳=1484650523378}]

Gary Russel sugestion之后的更新

...

@Bean
public IntegrationFlow send(){  
    return IntegrationFlows.from("service.input")
            .log(Level.DEBUG, "trace.http",
                    "'Request.\n'"+
                    ".concat('Headers : ').concat(headers.toString()).concat('\n')"+
                    ".concat('Payload : ').concat(payload.toString())"
                )                               
            .channel(MessageChannels.queue())
            .handle(this.httpOutboundAdapter()
            .transform(Transformers.toJson())
            .log(Level.DEBUG, "trace.http",
                    "'Response.\n'"+
                    ".concat('Headers : ').concat(headers.toString()).concat('\n')"+
                    ".concat('Payload : ').concat(payload.toString())"
                )
            .channel("nullChanel")
            .get();
}

日志

2017-01-17 13:58:31.929 DEBUG 19702---[ASK调度器-9]o.s.integration.channel.DirectChannel:在通道send.channel#3上预发送,消息:GenericMessage[有效负载=$PAYLOAD_JSON,标头=$HEADERS] 2017-01-17 13:58:31.930 DEBUG 19702---[ASK-调度程序-9]o. s. i. t.MessageTransformingHandler:org.springframework.integration.transformer.MessageTransformingHandler#0收到消息:GenericMessage[有效载荷=$PAYLOAD_JSON,标头=$HEADERS] 2017-01-17 13:58:31.932 DEBUG 19702---[ask-调度器-9]o.s.integration.channel.DirectChannel: pre发送频道'send.channel#5',消息:GenericMessage[有效载荷=$PAYLOAD_JSON,标头=$HEADERS] 2017-01-17 13:58:31.932 DEBUG 19702---[ask-调度器-9]o.s.integration.handler.LoggingHandler:org.springframework.integration.handler.LoggingHandler#1收到消息:GenericMessage GenericMessage[有效载荷=$PAYLOAD_JSON,标头=$HEADERS] 2017-01-17 13:58:31.942o.s.integration.handler.BridgeHandler:org.springframework.integration.handler.BridgeHandler#2收到消息:GenericMessage[有效负载=$PAYLOAD_JSON,标头=$HEADERS] 2017-01-17 13:58:31.943 DEBUG 19702---[ask-调度器-9]o.s.integration.channel.DirectChannel:在通道'nullChanel'上预发送,消息:GenericMessage[有效载荷=$PAYLOAD_JSON,报头=$HEADERS] 2017-01-17 13:58:31.944 DEBUG 19702---[ask调度器-9]o.s.integration.channel.DirectChannel:在通道'errorChannel'上预发送,消息:错误消息[有效载荷=org.springframework.messaging.消息传递例外:Dispatcher没有通道应用程序:29891.nullChanel的订阅者。;嵌套异常是org.springframework.integration.MessageDispatchingExc0019: Dispatcher没有订阅者,标头={id=fe0672cd-b9e4-9d43-2c5a-3d2d0a1c5493,时间戳=1484668711944}] 2017-01-17 13:58:31.945 DEBUG 19702---[请求调度器-9]o.s.integration.handler.LoggingHandler:org.springframework.integration.handler.LoggingHandler#2收到消息:错误消息[有效载荷=org.springframework.messaging.MessageDeliveryExc0019: Dispatcher没有订阅通道'应用程序:29891.nullChanel'。;嵌套异常是org.springframework.integration.MessageDispatchingExc0019:Dispatcher没有订阅者,标头={id=fe0672cd-b9e4-9d43-2c5a-3d2d0a1c5493,时间戳=1484668711944}] 2017-01-17 13:58:31.949 DEBUG 19702---[ASC-调度器-9]o. s. i. t.MessageTransformingHandler:org.springframework.integration.transformer.MessageTransformingHandler#1收到的消息:ErrorMessage[payload=org. springframework.消息。MessageDeliveryExc0019: Dispatcher没有订阅通道'应用程序: 29891. nullChanel'的用户。;嵌套异常是org. springframework.集成。MessageDispatchingExc0019: Dispatcher没有订阅者,标头={id=fe0672cd-b9e4-9d43-2c5a-3d2d0a1c5493,时间戳=1484668711944}] 2017-01-17 13:58:31.951 DEBUG 19702---[ask-调度器-9]o. s.集成. Channel。DirectChannel:在通道上预发'errorFlow. Channel#1',消息:GenericMessage[有效载荷=$PAYLOAD_JSON,标头=$HEADERS]

我分别用$payload_JSON和$HEADERS替换了负载和头部,以减少日志。

共有1个答案

袁致远
2023-03-14

您的网关有一个返回无效发送(...),因此框架不需要回复。

. log()元素是一个窃听(这就是第一个日志让消息流向队列通道的方式)。

由于您的流以日志(wireTap)结束,所以它期待消息的消费者或回复通道。

我们可能会做最后的。登录终端并查看(INT-4210),但现在您可以添加。频道(“空频道”)在最后一个之后。日志

 类似资料:
  • 我正在使用Spring Boot以及Spring集成版本。我正在尝试为调用远程超文本传输协议服务的Spring集成流之一正确设置重试建议。流程的简化草案如下所示:

  • 我正在处理Spring集成和文件。我正在使用提供的DSL来处理我的文件。在我的集成流程结束时,我使用文件将结果输出到一个新文件。outboundGateway(…) 。但是,我不断收到以下错误消息:没有可用的输出通道或replyChannel标头。根据这篇文章底部的帖子,解决方案是将预期回复设置为false,但是,我如何使用DSL做到这一点? 下面显示了我在集成流程的最后一部分中写入文件的操作。

  • 我写了一个带有请求和回复的简单消息流。我必须使用两个独立的队列,所以我声明AmqpOutboundAdapter发送消息,声明Amqp入站Adapter接收回复。 它应该适用于@MessagingGateway: ADUsersFindResponseConfig类类似于: 发送消息正常工作,但我在接收消息时遇到问题。我希望收到的消息将被传递到名为FIND_AD_USERS_REPLY_OUTPU

  • 前面两节里我们用到的输入和输出都是二维数组,但真实数据的维度经常更高。例如,彩色图像在高和宽2个维度外还有RGB(红、绿、蓝)3个颜色通道。假设彩色图像的高和宽分别是$h$和$w$(像素),那么它可以表示为一个$3\times h\times w$的多维数组。我们将大小为3的这一维称为通道(channel)维。本节我们将介绍含多个输入通道或多个输出通道的卷积核。 多输入通道 当输入数据含多个通道时

  • 问题内容: 当按预期执行时,goroutine不打印任何内容。 问题答案: 当函数结束时,程序也将结束。它不等待其他goroutine完成。 引用Go语言规范:程序执行: 程序执行首先初始化主程序包,然后调用函数。当该函数调用返回时,程序退出。它不等待其他(非)goroutine完成。 有关更多详细信息,请参见此答案。 您必须告诉您的函数等待以goroutine形式启动的函数完成。您可以将它们与通

  • 问题内容: 我正在寻找一种解决方案,可以多路复用一些通道输出。 我有一个数据源,它是从我发送到单个通道的读取的。另一方面,我有一个从通道读取的websocket请求处理程序。现在,发生了两个客户端创建一个websocket连接的情况,它们均从同一通道读取,但每个客户端仅获得部分消息。 代码示例(简体): 现在,当两次被调用时,第二个调用仅返回在第一个调用中创建的通道,这将导致上述问题。 问题是: