Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring Integration: no output-channel or replychannel header available

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.

like image 908
Blue Avatar asked Mar 26 '15 09:03

Blue


1 Answers

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.

like image 139
Artem Bilan Avatar answered Nov 06 '22 14:11

Artem Bilan