Spring集成入站通道适配器

时间:2018-02-22 03:21:20

标签: java class gradle override spring-integration-sftp

我有一个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) 等等...

0 个答案:

没有答案