[英]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.