我有一个Spring Integration监听器,其中ApplicationContext
如下:
final AbstractApplicationContext context = new ClassPathXmlApplicationContext(
// Spring Integration common xml
"classpath:contexts/bp-common.xml",
// File Upload Listener
"classpath:contexts/bp-integration-fileupload-context.xml");
在Spring集成监听器中,我希望每次都要求监听器重新扫描该文件夹。所以我这样做:
Map< String, FileReadingMessageSource > fileReadingSourceMap = new HashMap< String, FileReadingMessageSource >( );
fileReadingSourceMap = context.getBeansOfType( FileReadingMessageSource.class );
List< FileReadingMessageSource > fileReadingSourceList = new ArrayList< FileReadingMessageSource >(
fileReadingSourceMap.values( ) );
for ( FileReadingMessageSource frms : fileReadingSourceList ) {
frms.setScanEachPoll( true );
}
我将scanEachPoll
的值设置为true,以便每次它都会重新扫描目录。它的工作,我看到它每次扫描目录。默认为false。
编辑FileReadingMessageSource
类中的变量不是问题。但是我在编写这个类中的方法时遇到了一些问题。
本课程将采用以下方法:
private void scanInputDirectory() {
List<File> filteredFiles = scanner.listFiles(directory);
Set<File> freshFiles = new LinkedHashSet<File>(filteredFiles);
if (!freshFiles.isEmpty()) {
toBeReceived.addAll(freshFiles);
if (logger.isDebugEnabled()) {
logger.debug("Added to queue: " + freshFiles);
}
}
}
由于我的修改,此侦听器将每次扫描目录。因此,toBeReceived.addAll(freshFiles);
将继续添加一些相同的文件。我希望做一些事情来覆盖此方法,以便我可以在toBeReceived
之前先清除addAll()
队列。
我认为FileReadingMessageSource
课程来自bp-integration-fileupload-context.xml
。
<int-file:inbound-channel-adapter id="hostFilesOut" channel="hostFileOutChannel"
directory="${hostfile.dir.out}" prevent-duplicates="false"
filename-regex="${hostfile.out.filename-regex}" >
<int:poller id="poller" cron="${poller.cron:0,4,8,12,16,20,24,28,32,36,40,44,48,52,56 * * * * * }"
max-messages-per-poll="1" />
</int-file:inbound-channel-adapter>
我可以“注入”此xml部分以覆盖原始FileReadingMessageSource
类吗?
或者请建议更好的方法。
也许我的问题令人困惑,让我在这里添加一些例子:
实际上是这样的:
原始版本:
默认情况下,scanEachPoll为false。
因此,每次都不会调用scanInputDirectory()方法。它只会在队列为空时调用。
但是现在,我将scanEachPoll更改为true。 (这个可以很容易地改变)
当scanEachPoll为true时,每次都会调用scanInputDirectory()方法,所以它会像:
第一次扫描,添加到队列(1,2,3,4,5) poll(),成为(2,3,4,5) 第二次扫描,添加到队列将是(2,3,4,5)+(2,3,4,5)=&gt;成为(2,2,3,3,4,4,5,5) poll(),成为(2,3,3,4,4,5,5) 第3次扫描,添加到队列将成为原始队列+(3,4,5)==&gt;成为(2,3,3,4,4,5,5,3,4,5) 等等...