Spring集成+文件读取消息源_入站通道适配器+出站网关。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring集成+文件读取消息源_入站通道适配器+出站网关。相关的知识,希望对你有一定的参考价值。

对于文件阅读信息源的入站适配器和带注释的变压器,配置如下。

@Bean
@InboundChannelAdapter(autoStartup = "false", value = "incomingchannel", poller = @Poller("custompoller"))
    public MessageSource<File> fileReadingMessageSource() {

}

@Transformer(inputChannel = "incomingchannel", outputChannel = "jobLaunchChannel")
    public JobLaunchRequest toRequest(Message<File> message) throws Exception {

}

现在我想把Transformer改成指出站网关的回复通道,即把文件从一个目录移到另一个目录,即把文件从incomingchannel目录移到另一个目录,然后处理或转换文件或进行一些验证。

<file:outbound-gateway id="mover" request-channel="incomingchannel" reply-channel="newdirectory" directory="<<path to new directory file to be moved" delete-source-files="true"/>

有谁将上述XML配置转换为注释配置或有什么想法?

在注释配置后,我将不得不改变变压器输入通道,以参考newdirectory通道,即是一个消息网关的回复通道......

先谢谢你的任何帮助或建议

@Bean
@ServiceActivator(inputChannel = "incomingchannel")
public MessageHandler fileWritingMessageHandler() {
    FileWritingMessageHandler handler = new FileWritingMessageHandler(new File(newdirectorypath));
    handler.setFileExistsMode(FileExistsMode.APPEND);
    handler.setDeleteSourceFiles(true);
    return handler;
}

@MessagingGateway(defaultRequestChannel = "incomingchannel", defaultReplyChannel = "newdirectorychannel")
public interface MyGateway {

    void writeToFile(@Header(FileHeaders.FILENAME) String fileName, @Header(FileHeaders.FILENAME) File directory,
            String data);

}

但是遇到的问题有两个

  1. 入站适配器试图将目录也作为文件进行轮询(使用递归目录扫描器)--如何确保目录不作为文件轮询?

  2. 嵌套异常是 org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available, failedMessage=GenericMessage [payload=C

答案

好的,我知道了。因为看起来你想把你的 FileWritingMessageHandler 之后 @InboundChannelAdapter 而之前 @Transformer,所以这个应该像。

@Bean
@InboundChannelAdapter(autoStartup = "false", value = "incomingchannel", poller = @Poller("custompoller"))
    public MessageSource<File> fileReadingMessageSource() {

}

@Bean
@ServiceActivator(inputChannel = "incomingchannel")
public MessageHandler fileWritingMessageHandler() {
    FileWritingMessageHandler handler = new FileWritingMessageHandler(new File(newdirectorypath));
    handler.setFileExistsMode(FileExistsMode.APPEND);
    handler.setDeleteSourceFiles(true);
    handler.setOutputChannelName("jobLaunchTransfromerCannel");
    return handler;
}

@Transformer(inputChannel = "jobLaunchTransfromerCannel", outputChannel = "jobLaunchChannel")
    public JobLaunchRequest toRequest(Message<File> message) throws Exception {

}

这样一来... @InboundChannelAdapter 将一个文件发送到一个 FileWritingMessageHandler 的逻辑,为下一个流程生成一个结果文件。@Transformer 将结果文件转换为 JobLaunchRequest. 只有在这之后,才会有一条信息被发送至 jobLaunchChannel 递交Spring Batch Job.

以上是关于Spring集成+文件读取消息源_入站通道适配器+出站网关。的主要内容,如果未能解决你的问题,请参考以下文章

如何测试在弹簧集成中使用通道的热文件夹?

Spring Integration - 入站通道适配器执行下游通道并行处理

Spring集成轮询器与调度程序

没有为通道适配器定义轮询器

Intellij spring集成流程图

测试JMS和Spring集成