繁体   English   中英

Spring集成邮件轮询器

[英]Spring integration mail poller

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

这是一个独立的应用程序(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不是一个选项。

我可以向你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 ,并且在决定关闭应用程序之前,您确实不应该丢失进程。

其中一个不错的选择是CountDownLatch其中1作为bean计数。 您应该在System.exit(0)之前从main等待它,或者只是在流程结束时使用最后一个:

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

但是你应该考虑更多,如果它真的适合你只运行一次适配器,如果max-messages-per-poll="1"是非常好的选择。

邮箱中可能没有邮件,因此onlyOnceTrigger可能会在没有良好结果的情况下完成,而您的应用程序已陷入虚空......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM