gpt4 book ai didi

java - IMAP 空闲,是否有可能错过事件?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:58:42 28 4
gpt4 key购买 nike

我在 java 中实现了一个邮件监听器,监听器进入 IDLE 直到新邮件到达,它打印电子邮件主题并立即再次返回 IDLE。

我是否有可能错过我发出的两个 IDLE 之间的事件(新电子邮件)?

例如,我试过在再次进入 IDLE 之前睡 10 秒,在这 10 秒内我向我正在监控的收件箱发送了 2 封电子邮件,在 10 秒之后我回到 IDLE 我的 MessageCountListener 只被调用一次,用于第一封电子邮件。第二个被错过了。

也许我不应该依赖 MessageCountListener

       messageCountListener = new MessageCountListener() {
//lets go into idle again and then handle the message
public void messagesAdded(MessageCountEvent ev) {
Message message = ev.getMessages()[0];
try {
SimpleLogger.info("New message, subject: " + message.getSubject());
} catch (MessagingException e) {
e.printStackTrace();
}

//GeneralUtility.threadSleep(8000);

startImapIdle();
}

startImapIdle() 最初被调用,然后像上面那样从 messagesAdded() 重新调用。

private void startImapIdle() {
SimpleLogger.info("Idling now");

Runnable r = () -> {
try {
inboxFolder.idle(false);
} catch (FolderClosedException e) {
SimpleLogger.warn("Push Error: [DISCONNECT]", e);
GeneralUtility.threadSleep(mailListenerRetryInterval);
startListening(inboxFolder);
} catch (StoreClosedException e) {
SimpleLogger.warn("Push Error: [GLOBAL DISCONNECT]", e);
GeneralUtility.threadSleep(mailListenerRetryInterval);
initConnection();
} catch (MessagingException e) {
SimpleLogger.warn("Push Error: [NO IDLE]", e);
GeneralUtility.threadSleep(mailListenerRetryInterval);
initConnection();
} catch (Exception e) {
SimpleLogger.warn("Push Error: [UNKNOWN]", e);
GeneralUtility.threadSleep(mailListenerRetryInterval);
initConnection();
}
};

imapIdleThread = new Thread(r);
imapIdleThread.start();
}

编辑:(新代码)

   private void startImapIdle() {
while(true) {
try {
SimpleLogger.info("Idling now");
MailUtility.ensureFolderOpen(folder);
folder.idle();
} catch (FolderClosedException e) {
SimpleLogger.warn("Push Error: [DISCONNECT]", e);
GeneralUtility.threadSleep(mailListenerRetryInterval);
startListening();
break;
} catch (StoreClosedException e) {
SimpleLogger.warn("Push Error: [GLOBAL DISCONNECT]", e);
GeneralUtility.threadSleep(mailListenerRetryInterval);
initConnection();
break;
} catch (MessagingException e) {
SimpleLogger.warn("Push Error: [NO IDLE]", e);
GeneralUtility.threadSleep(mailListenerRetryInterval);
initConnection();
break;
} catch (Exception e) {
SimpleLogger.warn("Push Error: [UNKNOWN]", e);
GeneralUtility.threadSleep(mailListenerRetryInterval);
initConnection();
break;
}
}
}

最佳答案

你是怎么做到的?下面的代码运行良好。

inbox.addMessageCountListener(new MessageCountAdapter() { ... })

当然你需要有另一个无限循环,比如:

          while (true) {
IMAPFolder f = (IMAPFolder)inbox;
f.idle();
}

关于java - IMAP 空闲,是否有可能错过事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31180843/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com