2014-10-10 68 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