我对 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"/>
根据以上内容,我的理解是:
我能够如下在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集成。
请帮助我了解基本流程并完成此操作。任何帮助和评论都非常感谢。
谢谢。
答案 0 :(得分:0)
首先,您需要了解@Bean
方法完全适用于配置和组件定义,这些定义将在以后的运行时使用。您绝对不能在@Bean
中调用业务逻辑。我的意思是您的beaObject.load()
是完全错误的。
因此,请先阅读Spring Framework Docs,以了解什么是@Bean
及其父级@Configuration
:https://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