Spring 集成:没有 output-channel 或 replychannel header 可用
Spring Integration: no output-channel or replychannel header available
我写了一个简单的 spring 集成应用程序,可以将文件从一个目录移动到另一个目录,它看起来像这样:
@Bean
@InboundChannelAdapter(value="requestChannel", poller = @Poller(fixedDelay="100"))
public FileReadingMessageSource adapter(){
FileReadingMessageSource source = new FileReadingMessageSource();
source.setDirectory(new File("D:/TestIn"));
return source;
}
@Bean
MessageChannel requestChannel(){
return new DirectChannel();
}
@Bean
@ServiceActivator(inputChannel="requestChannel")
public FileWritingMessageHandler handle(){
FileWritingMessageHandler handler = new FileWritingMessageHandler(new File("D:/TestOut"));
handler.setDeleteSourceFiles(true);
return handler;
}
它工作得很好,但是每次复制操作都会给我这个异常
2015-03-26 09:56:39.222 INFO 4772 --- [ask-scheduler-5] o.s.i.file.FileReadingMessageSource : Created message: [GenericMessage [payload=D:\TestIn.txt, headers={id=d8b27257-0a90-b7ad-65cb-85e93668fb5a, timestamp=1427360199222}]]
2015-03-26 09:56:39.223 ERROR 4772 --- [ask-scheduler-5] o.s.integration.handler.LoggingHandler : org.springframework.messaging.MessagingException: ; nested exception is org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available
at org.springframework.integration.dispatcher.AbstractDispatcher.wrapExceptionIfNecessary(AbstractDispatcher.java:133)
我在另一个主题中读到,当您在代码中的某处过滤掉 headers 时会发生这种情况,但是此跟踪的第一行告诉我,唯一生成的 headers 是 id 和时间戳。
一切看起来都不错,但不是:您没有遇到 filter out the headers somewhere
问题。
那是因为 FileWritingMessageHandler
默认为 request/reply
。
要达到您的 just move
要求,您应该添加以下内容:
handler.setExpectReply(false);
该组件的代码如下所示:
if (!this.expectReply) {
return null;
}
if (resultFile != null) {
if (originalFileFromHeader == null && payload instanceof File) {
return this.getMessageBuilderFactory().withPayload(resultFile)
.setHeader(FileHeaders.ORIGINAL_FILE, payload);
}
}
return resultFile;
因此,它尝试将 resultFile
发送到 @ServiceActivator
端点的 outputChannel
。由于您没有这样的选项并且没有 replyChannel
header 您最终会遇到该异常。
我写了一个简单的 spring 集成应用程序,可以将文件从一个目录移动到另一个目录,它看起来像这样:
@Bean
@InboundChannelAdapter(value="requestChannel", poller = @Poller(fixedDelay="100"))
public FileReadingMessageSource adapter(){
FileReadingMessageSource source = new FileReadingMessageSource();
source.setDirectory(new File("D:/TestIn"));
return source;
}
@Bean
MessageChannel requestChannel(){
return new DirectChannel();
}
@Bean
@ServiceActivator(inputChannel="requestChannel")
public FileWritingMessageHandler handle(){
FileWritingMessageHandler handler = new FileWritingMessageHandler(new File("D:/TestOut"));
handler.setDeleteSourceFiles(true);
return handler;
}
它工作得很好,但是每次复制操作都会给我这个异常
2015-03-26 09:56:39.222 INFO 4772 --- [ask-scheduler-5] o.s.i.file.FileReadingMessageSource : Created message: [GenericMessage [payload=D:\TestIn.txt, headers={id=d8b27257-0a90-b7ad-65cb-85e93668fb5a, timestamp=1427360199222}]]
2015-03-26 09:56:39.223 ERROR 4772 --- [ask-scheduler-5] o.s.integration.handler.LoggingHandler : org.springframework.messaging.MessagingException: ; nested exception is org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available
at org.springframework.integration.dispatcher.AbstractDispatcher.wrapExceptionIfNecessary(AbstractDispatcher.java:133)
我在另一个主题中读到,当您在代码中的某处过滤掉 headers 时会发生这种情况,但是此跟踪的第一行告诉我,唯一生成的 headers 是 id 和时间戳。
一切看起来都不错,但不是:您没有遇到 filter out the headers somewhere
问题。
那是因为 FileWritingMessageHandler
默认为 request/reply
。
要达到您的 just move
要求,您应该添加以下内容:
handler.setExpectReply(false);
该组件的代码如下所示:
if (!this.expectReply) {
return null;
}
if (resultFile != null) {
if (originalFileFromHeader == null && payload instanceof File) {
return this.getMessageBuilderFactory().withPayload(resultFile)
.setHeader(FileHeaders.ORIGINAL_FILE, payload);
}
}
return resultFile;
因此,它尝试将 resultFile
发送到 @ServiceActivator
端点的 outputChannel
。由于您没有这样的选项并且没有 replyChannel
header 您最终会遇到该异常。