I have the following configuration file for Spring Integration File:
@Configuration
@EnableIntegration
public class MyIntegrationConfiguration {
private static final String FILE_CHANNEL_PROCESSING = "processingfileChannel";
private static final String INTERVAL_PROCESSING = "5000";
private static final String FILE_PATTERN = "*.txt";
@Value("${import.path.source}")
private String sourceDir;
@Value("${import.path.output}")
private String outputDir;
@Bean
@InboundChannelAdapter(value = FILE_CHANNEL_PROCESSING, poller = @Poller(fixedDelay = INTERVAL_PROCESSING))
public MessageSource<File> sourceFiles() {
FileReadingMessageSource source = new FileReadingMessageSource();
source.setAutoCreateDirectory(true);
source.setDirectory(new File(sourceDir));
source.setFilter(new SimplePatternFileListFilter(FILE_PATTERN));
return source;
}
@Bean
@ServiceActivator(inputChannel = FILE_CHANNEL_PROCESSING)
public MessageHandler processedFiles() {
FileWritingMessageHandler handler = new FileWritingMessageHandler(new File(outputDir));
handler.setFileExistsMode(FileExistsMode.REPLACE);
handler.setDeleteSourceFiles(true);
handler.setExpectReply(true);
return handler;
}
@Bean
public IntegrationFlow processFileFlow() {
return IntegrationFlows
.from(FILE_CHANNEL_PROCESSING)
.transform(fileToStringTransformer())
.handle("fileProcessor", "processFile").get();
}
@Bean
public MessageChannel fileChannel() {
return new DirectChannel();
}
@Bean
public FileProcessor fileProcessor() {
return new FileProcessor();
}
@Bean
public FileToStringTransformer fileToStringTransformer() {
return new FileToStringTransformer();
}
}
For FileWritingMessageHandler
from this documentation it says that if setExpectReply(true)
is set:
Specify whether a reply Message is expected. If not, this handler will simply return null for a successful response or throw an Exception for a non-successful response.
My question is: where can I catch these exceptions or where can I retrieve this message/response?
The
@ServiceActivator
has anoutputChannel
attribute:That's for successful replies.
Any exceptions (independently of the
setExpectReply()
) are just thrown to the caller. In your case the story is about an@InboundChannelAdapter
. In this case the exception is caught and wrapped to theErrorMessage
to be sent to theerrorChannel
on the@Poller
. It is a globalerrorChannel
by default: https://docs.spring.io/spring-integration/docs/5.0.4.RELEASE/reference/html/configuration.html#namespace-errorhandlerHowever you have some other problem in your code. I see the second subscriber to the
FILE_CHANNEL_PROCESSING
. If it's not aPublishSubscribeChannel
, you are going to have a round-robin distribution for messages sent to this channel. But that's already a different story. Just don't ask that question here, please!