I wrote a simple spring integration application that moves files from one directory to another, it looks like this:
@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;
}
It works perfectly well, but every copy operation gives me this exception
2015-03-26 09:56:39.222 INFO 4772 --- [ask-scheduler-5] o.s.i.file.FileReadingMessageSource : Created message: [GenericMessage [payload=D:\TestIn\9.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)
I read in another topic that this happens when you filter out the headers somewhere in your code, but the first line of this trace tells me, that the only headers generated are id and timestamp.
Everything looks good, but no: you don't face the filter out the headers somewhere
issue.
That's just because FileWritingMessageHandler
is request/reply
by default.
To achieve you just move
requirement you should add this:
handler.setExpectReply(false);
The code from that components looks like:
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;
So, it tries to send resultFile
to the outputChannel
of the endpoint for that @ServiceActivator
. Since you don't have such an option and there is no replyChannel
header you end up with that Exception.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With