Spring Integrtion XML和Java Config转换

时间:2018-11-06 07:48:40

标签: spring-integration

我对 Spring Integration 来说还很陌生,我的项目正在使用文件支持来读取文件并将其加载到数据库中。

我有XML配置,试图了解其内容。

<int-file:inbound-channel-adapter auto-startup= true channel="channelOne" directory="${xx}" filename-regex="${xx}" id="id" prevent-duplicates="false">
        <int:poller fixed-delay="1000" receive-timeout="5000"/>
</int-file:inbound-channel-adapter>        

<int:channel id="channelOne"/>

根据以上内容,我的理解是:

  1. 我们定义一个频道,然后
  2. 然后定义inbound-channel-adapter-这将查找文件的目录并创建一条以文件为有效负载的消息。

我能够如下在JavaConfig中进行转换:

@Bean
public MessageChannel fileInputChannel() {
    return new DirectChannel();
}

@Bean
@InboundChannelAdapter(value = "fileInputChannel", poller = @Poller(fixedDelay = "1000"))
    public MessageSource<File> fileReadingMessageSource() {
        FileReadingMessageSource sourceReader= new FileReadingMessageSource();
        RegexPatternFileListFilter regexPatternFileListFilter = new RegexPatternFileListFilter(
                file-regex);

        //List<FileListFilter<File>> fileListFilter = new ArrayList<FileListFilter<File>>();
        fileListFilter.add(regexPatternFileListFilter);
        //CompositeFileListFilter compositeFileListFilter = new CompositeFileListFilter<File>(
                fileListFilter);
        sourceReader.setDirectory(new File(inputDirectorywhereFileComes));
        sourceReader.setFilter(regexPatternFileListFilter );
        return sourceReader;
    }

然后是下一段代码,从字面上我很难理解,而且还要转换为JavaConfig。

这是下一块:

<int-file:outbound-gateway
        delete-source-files="true"
        directory="file:${pp}"
        id="id"
        reply-channel="channelTwo"
        request-channel="channelOne"
        temporary-file-suffix=".tmp"/>

<int:channel id="channelTwo"/>
<int:outbound-channel-adapter channel="channelTwo" id="id" method="load" ref="beanClass"/>

因此,根据我的理解,

1:定义输出通道。 2:定义出站网关,该网关会将消息再次作为文件写入目录(另一个),并从源目录中删除文件。最后,它将调用方法Bean Class。这是我们的类,并且具有load方法,该方法将文件作为输入并将其加载到DB。

我试图将其隐藏到Java Config中。这是我的代码:

 @Bean
    @ServiceActivator(inputChannel= "fileInputChannel")
    public MessageHandler fileWritingMessageHandler() throws IOException, ParseException {
        FileWritingMessageHandler handler = new FileWritingMessageHandler(new File(path to output directory));
        handler.setFileExistsMode(FileExistsMode.REPLACE);

    beaObject.load(new File(path to output directory or input directory:: Nothing Worked));
        handler.setDeleteSourceFiles(true);
        handler.setOutputChannel(fileOutputChannel());
        return handler;
    }

我可以将此文件写入输出文件夹,也可以从源中删除。之后,我完全迷路了。我必须调用BeanClass的Load方法(XML中的ref = class)。

我尝试了很多,但未能成功。多次读取集成文件支持文档,但无法读取。

注意::尝试时,出现一个错误,提示“找不到文件异常”。我相信,我能够调用我的方法,但无法获取文件。

此XML配置工作正常。

如果可能,任何人都可以建议与DSL进行Spring集成。

请帮助我了解基本流程并完成此操作。任何帮助和评论都非常感谢。

谢谢。

1 个答案:

答案 0 :(得分:0)

首先,您需要了解@Bean方法完全适用于配置和组件定义,这些定义将在以后的运行时使用。您绝对不能在@Bean中调用业务逻辑。我的意思是您的beaObject.load()是完全错误的。

因此,请先阅读Spring Framework Docs,以了解什么是@Bean及其父级@Configurationhttps://docs.spring.io/spring/docs/5.1.2.RELEASE/spring-framework-reference/core.html#beans-java

您对@ServiceActivator的{​​{1}}确实是正确的(当您删除该FileWritingMessageHandler时)。您仅需要声明一个beaObject.load(),以便在消息@ServiceActivator中出现时在运行时调用beaObject.load()

fileOutputChannel

有关更多信息,请参见https://docs.spring.io/spring-integration/docs/5.1.1.BUILD-SNAPSHOT/reference/html/configuration.html#annotations