簡體   English   中英

JavaMail監視新消息

[英]JavaMail Monitoring For New Messages

我有一個程序應該監視我們的Dovecot IMAP服務器,並接收和處理服務器發送的任何新消息。 我遇到的問題是,該消息被多次處理,即Dovecot多次發送同一條消息的通知。

以下是我嘗試過的技巧。

  1. 將偵聽器附加到文件夾。 睡眠和獲取消息數是無限的。 處理完一條消息后將其標記為可見。 這是行不通的,因為服務器沒有足夠快地更新其一側的seeed標志,因此發生了重新處理。

  2. 將偵聽器附加到文件夾。 空轉無限。 處理完一條消息后,將其標記為已刪除 在循環瀏覽所有消息並將其標記為已刪除之后,在messagesAdded收藏夾中,刪除文件夾,關閉文件夾,然后重新打開文件夾。 結果是它不會處理所有消息,並且不會發生實際mbox文件中的刪除,並且還會發生重新處理。

  3. 將偵聽器附加到文件夾。 無限地睡覺和空轉。 處理完一條消息后,將其標記為已刪除 在循環瀏覽所有郵件並將其標記為已刪除后,在“ messagesAdded收藏夾”中,刪除文件夾。 結果是有時會發生重新處理。

我還能嘗試什么? 以下是上述第三個用例的摘錄,這是我最近嘗試過的。 下面的方法在從主線程派生的守護進程線程中運行。

private static void listenMessages() {
        try {
            // Add messageCountListener to listen for new messages
            _messageListener = new MessageCountAdapter() {
                @Override
                public void messagesAdded(MessageCountEvent ev) {
                    Message[] msgs = ev.getMessages();

                    // Send new messages to specified users
                    for (Message msg : msgs) {
                        try {
                            //
                            // Collect the whole message. Check if the
                            // DiscussionId has been set in the Header.
                            //

                            if(msg.isExpunged()) {
                                log.warn("Message is expunged, continue");
                                continue;
                            }

                            String sContents = null;
                            try {
                                log.info(msg.getSubject().toString());
                                sContents = getText(msg);
                            } catch(MessageRemovedException mo) {
                                log.warn("Message has already been processed and expunged, continue");
                            }

                            boolean bCollaborationService = isCollaborationService(sContents);

                            if (bCollaborationService) {
                                dispatchMessage(((InternetAddress) msg.getFrom()[0]).getAddress(), msg.getReceivedDate().getTime(), sContents);
                            }
                            msg.setFlag(Flags.Flag.DELETED, true);
                        } catch (IOException ioex) {
                            log.error(ioex.getMessage(), ioex);
                        } catch (MessagingException mex) {
                            log.error(mex.getMessage(), mex);
                        }
                    }
                    try {
                        _folder.expunge();
                    } catch (MessagingException e) {
                        // TODO Auto-generated catch block
                        log.error("Error Deleting Messages", e);
                    }
                }
            };
            _folder.addMessageCountListener(_messageListener);

            // Check mail once in "freq" MILLIseconds
            int freq = 20000;

            while (_messageListener != null) {
                try {
                    Thread.sleep(freq); // sleep for freq milliseconds
                } catch (InterruptedException e) {
                    // We've been interrupted: no more messages.
                    log.error("I have been interrrupted from MailRouter "
                            + e.getMessage(), e);
                }
                _folder.idle();
            }

        } catch (Exception ex) {
            log.error("Exception Occuered: " + ex.getMessage(), ex);
        }
    }

很難說出您的問題是否與Dovecot的怪癖或處理消息的方式有關...

您的消息處理是單線程的嗎? 如果是這樣,是否足以跟蹤已處理的最高消息號或消息UID?

您是否擔心在處理消息的過程中消息處理應用程序崩潰時會發生什么情況?

我們可能需要更多地了解您的要求,以確定最佳的進行方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM