【问题标题】:Spring integration mail pollerSpring集成邮件轮询器
【发布时间】:2014-12-06 01:19:37
【问题描述】:

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

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

【问题讨论】:

    标签: java spring imap spring-integration


    【解决方案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();
                  }
           };
    }
    

    应该将其注入该适配器的&lt;int:poller&gt;

    但是,如果您说它是独立的应用程序,您应该注意整个应用程序的一些barrier,并且在您决定关闭应用程序之前您真的不应该丢失进程。

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

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

    但是,如果它真的适合您只运行一次适配器并且max-messages-per-poll="1" 确实是一个不错的选择,那么您应该考虑更多。

    邮箱中可能没有消息,因此onlyOnceTrigger 可能会在没有为您带来良好结果的情况下完成,并且您的应用已陷入空白......

    【讨论】:

    • 非常感谢!我设法使用了 onlyOnceTrigger。我有另一个问题,我正在使用 DirectChannel 接收消息。您上面提到的障碍的正确渠道是正确的渠道还是我应该使用其他渠道? (我无法知道该过程何时完成,因此请倒计时以锁定)我有类似receiveChannel.suscribe() ...
    • 其实poller之后的频道类型并不重要。从另一方面看,有时DirectChannel 更好,因为该下游过程将在轮询器的线程中完成。所以你不要开始一个新的。无论如何,对于您的情况,poller 是单独的线程,您真的应该等待该线程的结果,或者只是从进程结束时调用System.exit(0)。回答您的问题:不,频道不是barrier。这应该会阻止您的应用程序无条件地调用System.exit(0)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 2018-01-29
    • 2017-10-26
    相关资源
    最近更新 更多