我在我的应用程序中收到一个错误,我没有得到解决方案。应用程序请求REST/JSON,并尝试与另一个应用程序合并。有一个轮询器异步调用每个请求。当一个do请求总是分派错误“没有输出通道或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();
}日志打印:
在通道‘错误通道’上的org.springframework.messaging.core.DestinationResolutionException:(sent=true),消息: ErrorMessage ErrorMessage调度器未能传递消息;嵌套的例外是org.springframework.messaging.core.DestinationResolutionException:无输出通道或replyChannel报头可用,headers={id=826074c0-d1c6-4ecf-44f0-6da697b29f9c,timestamp=1484650523378}
在Gary摄入后的更新
..。
@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:31.929调试19702 -ask调度器-9 o.s.integration.channel.DirectChannel : preSend on channel 'send.channel#3',消息: GenericMessage payload=$PAYLOAD_JSON,headers=$HEADERS 2017-01-17 : 13:58:31.930 DEBUG 19702 -ask调度器-9 o.s.i.t.MessageTransformingHandler : GenericMessage payload=$PAYLOAD_JSON,org.springframework.integration.handler.LoggingHandler#1 headers=$HEADERS 2017-01-17 13:58:31.932调试19702 -ask调度器-9 o.s.integration.channel.DirectChannel : preSend on channel 'send.channel#5',消息: GenericMessage payload=$PAYLOAD_JSON,headers=$HEADERS 2017-01-17 : 13:58:31.932调试19702 --ask调度程序-9 o.s.integration.handler.LoggingHandler : GenericMessage GenericMessage payload=$PAYLOAD_JSON,org.springframework.integration.handler.BridgeHandler#2 o.s.integration.handler.BridgeHandler : GenericMessage payload=$PAYLOAD_JSON,headers=$HEADERS 2017-01-17 13:31.943调试19702 --ask调度程序-9 o.s.integration.channel.DirectChannel : preSend频道'nullChanel',消息: GenericMessage payload=$PAYLOAD_JSON,payload=org.springframework.messaging.MessageDeliveryException:调度器: headers=$HEADERS 2017-01-17 13:58:31.944调试19702 -询问调度器-9 o.s.integration.channel.DirectChannel : preSend on channel 'errorChannel',消息: ErrorMessage Dispatcher没有订阅频道‘应用程序:29891.nullChanel’.嵌套的例外是org.springframework.integration.MessageDispatchingException:调度程序没有订户,headers={id=fe0672cd-b9e4-9d43-2c5a-3d2d0a1c5493,timestamp=1484668711944} 2017-01-17 13:58:31.945调试19702 -ask-调度程序-9 o.s.integration.handler.LoggingHandler : org.springframework.integration.handler.LoggingHandler#2接收消息: ErrorMessage payload=org.springframework.messaging.MessageDeliveryException: Dispatcher没有订阅通道‘应用程序:29891.nullChanel’.嵌套的例外是org.springframework.integration.MessageDispatchingException:调度程序没有订户,headers={id=fe0672cd-b9e4-9d43-2c5a-3d2d0a1c5493,timestamp=1484668711944} 2017-01-17 13:58:31.949调试19702 -ask-调度程序-9 o.s.i.t.MessageTransformingHandler : org.springframework.integration.transformer.MessageTransformingHandler#1接收消息: ErrorMessage payload=org.springframework.messaging.MessageDeliveryException: Dispatcher没有订阅通道‘应用程序:29891.nullChanel’.嵌套异常是org.springframework.integration.MessageDispatchingException:Dispatcher没有订户,headers={id=fe0672cd-b9e4-9d43-2c5a-3d2d0a1c5493,timestamp=1484668711944} 2017-01-17 13:58:31.951调试19702 -询问调度程序-9 o.s.integration.channel.DirectChannel : preSend on信道'errorFlow.channel#1',消息: GenericMessage payload=$PAYLOAD_JSON,headers=$HEADERS
我分别用$PAYLOAD_JSON和$HEADERS替换了有效负载和头,以减少日志。
发布于 2017-01-17 14:03:34
您的网关有一个void返回void send(...),因此框架不需要回复。
.log()元素是一个监听(这是第一个日志允许消息流到队列通道的方式)。
由于您的流以日志(wireTap)结束,因此它期待消息或回复通道的使用者。
我们可能会制作一个最终的.log终端,并将对其进行研究(INT-4210),但现在您可以在最后的.log之后添加.channel("nullChannel")。
https://stackoverflow.com/questions/41695292
复制相似问题