2014-10-10 65 views
1

我想为我的邮件适配器配置轮询器,只运行一次或以编程方式运行它。Spring集成邮件轮询器

这是一个独立的应用程序(java -jar xxxx.jar),所以我想也许一个选择是配置fixed-rate属性,为任意最大值,然后退出应用程序,即:System.exit(0)

对于这种情况,是否有更多的替代方案或某种“正确方法”?

这是我integration-context.xml

<int-mail:inbound-channel-adapter id="imapAdapter" 
            store-uri="imaps://${imap.user}:${imap.password}@${imap.server.ip}:${imap.server.port}/inbox" 
            channel="receiveChannel" 
            auto-startup="true" 
            should-delete-messages="false" 
            should-mark-messages-as-read="false"          
            java-mail-properties="javaMailProperties" 
            mail-filter-expression="subject matches '(?i)*UNSUSCRIBE*'"> 
    <int:poller max-messages-per-poll="1" fixed-rate="5000"/> 
</int-mail:inbound-channel-adapter> 

PS:遗憾的是imap-idle-channel-adapter是不是一种选择。

回答

1

我可以建议你OnlyOnceTrigger

@Bean 
public Trigger onlyOnceTrigger() { 
     return new Trigger() { 
       private final AtomicBoolean invoked = new AtomicBoolean(); 
       @Override 
       public Date nextExecutionTime(TriggerContext triggerContext) { 
        return this.invoked.getAndSet(true) ? null : new Date(); 
       } 
     }; 
} 

哪些应注射到你该适配器的<int:poller>

但是如果你说,这是一个独立的,你真的是你决定关闭该应用程序之前,不应该输的过程,你应该注意的一些barrier整个应用程序。

其中一个很好的选择是CountDownLatch1算作一个bean。你应该等待它从你mainSystem.exit(0)之前或只使用在过程结束最后一个:

<outbound-channel-adapter expression="T(System).exit(0)"/> 

然而,你应该多想想,如果真的是适合你的运行适配器只有一次,如果那max-messages-per-poll="1"是非常好的选择。

有可能在邮箱中没有消息,所以onlyOnceTrigger可能没有好成绩完成为您和您的应用程序已进入紧张的空白......

+0

太谢谢你了!我成功地使用onlyOnceTrigger。我有另一个问题,我使用DirectChannel来接收消息。上面提到的屏障是正确的渠道,还是应该使用其他渠道? (我不知道什么时候该过程完成,因此做countDown锁)我有一些像'receiveChannel.suscribe()...' – whyem 2014-10-13 19:36:44

+1

其实,哪个频道类型是'轮询之后并不重要'。从另一方面来说,有时候'DirectChannel'会更好,因为这个downstrem过程将在poller的线程内完成。所以你不要开始一个新的。无论如何,对于你的情况'poller'是separete线程,你真的应该等待该线程的结果,或者只是从进程结束时调用'System.exit(0)'。回答你的问题:不,渠道不是“障碍”。这是应该阻止你的应用无条件地调用'System.exit(0)'的东西。 – 2014-10-14 07:28:38