Handle expected return from Spring Integration Fil

2019-06-07 19:24发布

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?

1条回答
劫难
2楼-- · 2019-06-07 20:02

The @ServiceActivator has an outputChannel attribute:

/**
 * Specify the channel to which this service activator will send any replies.
 * @return The channel name.
 */
String outputChannel() default "";

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 the ErrorMessage to be sent to the errorChannel on the @Poller. It is a global errorChannel by default: https://docs.spring.io/spring-integration/docs/5.0.4.RELEASE/reference/html/configuration.html#namespace-errorhandler

However you have some other problem in your code. I see the second subscriber to the FILE_CHANNEL_PROCESSING. If it's not a PublishSubscribeChannel, 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!

查看更多
登录 后发表回答