2017-03-01 67 views
1

我的需求。是轮询一个指定的时间间隔,例如10分钟的目录。如果一个特定扩展名的文件在目录中找到* .xml,那么它只是消耗(即选择和删除)该文件,并在指定的时间(例如10分钟)之后打印其他名称,然后发送邮件该文件没有被挑选(即消耗)或文件没有来。使用Spring集成轮询文件时的问题

有2个选项,我可以通过Spring集成或Core Java的WatchService来完成。以下是我一直写到现在的Spring Integration代码:

<int:channel id="fileChannel" /> 
<int:channel id="processedFileChannel" /> 

<context:property-placeholder location="localProps.properties" /> 

    <int:poller default="true" fixed-rate="10000" id="poller"></int:poller> 

    <int-file:inbound-channel-adapter 
     directory="file:${inbound.folder}" channel="fileChannel" 
     filename-pattern="*.xml" /> 

    <int:service-activator input-channel="fileChannel" 
     ref="fileHandlerService" method="processFile" output-channel="processedFileChannel"/> 

    <bean id="fileHandlerService" class="com.practice.cmrs.springintegration.Poll" /> 

以上代码已成功地针对特定文件模式轮询文件夹。现在我有两件事要做:

1)停止轮询后特定的时间间隔(可配置)说10分钟。

2)检查文件夹中是否有特定扩展名的文件...如果文件存在(它会消耗然后删除),否则它会向一群人发送电子邮件(电子邮件部分已完成。 )

请帮我在上述2点。

回答

0

您可以使用Smart Poller来做这样的事情。

如果/当轮询结果为消息时,您可以调整轮询器和/或采取不同的操作。

版本4.2引入了AbstractMessageSourceAdvice。建议链中的任何建议对象都是该类的子类,仅适用于接收操作。这样的类实现以下方法:

beforeReceive(MessageSource<?> source) 

此方法在MessageSource.receive()方法之前调用。它使您能够在此时检查和/或重新配置源。返回false将取消此轮询(类似上面提到的PollSkipAdvice)。

Message<?> afterReceive(Message<?> result, MessageSource<?> source) 

此方法的接收()方法之后调用;再次,您可以重新配置源,或者根据结果采取任何操作(如果没有源创建的消息,则可以为null)。你甚至可以返回一个不同的信息!

+0

请问我能举一个简单的例子吗? ....我也没有从网上获得任何例子......所以它变得困难......一个例子会有帮助。 – sid

+0

可以以某种方式使用cron表达式来完成这项工作吗? – sid

+0

不是只有一个,但可以在'CompoundTriggerAdvice' [javadocs here]中使用两个cron触发器(http://docs.spring.io/spring-integration/docs/5.0.0.BUILD-SNAPSHOT/reference/ HTML /消息通道-section.html#_compoundtriggeradvice)。 –