我在Scala中使用IdleManager来收听Gmail文件夹。
我已经有props.setProperty("mail.imaps.usesocketchannels", "true")
我的代码的主要部分是这样的:
folder.addMessageCountListener(new MessageCountAdapter() {
override def messagesAdded(ev: MessageCountEvent) {
Logger.info("Got " + ev.getMessages.length + " new messages")
idleManager.watch(folder)
}
})
// timeLength = 20 minutes
system.scheduler.schedule(initialDelay = timeLength, interval = timeLength) {
try {
folder.asInstanceOf[IMAPFolder].doCommand(new IMAPFolder.ProtocolCommand() {
def doCommand(p: IMAPProtocol) = {
p.simpleCommand("NOOP", null)
null
}
})
Logger.debug("Continue after sending NOOP")
idleManager.watch(folder)
} catch {
case e: Exception => Logger.error(s"MailHelper: ${e.getMessage}")
}
}
idleManager.watch(folder)
您可以看到我在收到新消息后以及发送NOOP命令后让idleManager
继续观看该文件夹。创建scheduler
以定期(当前,在20分钟内一次)向服务器发送NOOP命令以保持连接。我的程序工作正常,但只是一段时间。
第一次通话idleManager.watch(folder)
后14小时,收到上一封电子邮件后大约12.5小时,我仍然得到了日志Continue after sending NOOP
,但在此之后是错误日志MailHelper: Folder is not using SocketChannels
。< / p>
你能帮帮我吗?
编辑: 谢谢@BillShannon的快速回复。我已从v1.5.2更新到v1.5.6并打开了调试输出。我确定了Properties对象和&#34; store&#34;实例(使用&#34; imaps&#34;协议创建的会话)不变。
错误再次出现。调用idleManager.watch(folder)
后,这是日志([文件夹]是我文件夹的imaps协议字符串)
DEBUG IMAP: IdleManager watching [folder]
A385 IDLE
+ idling
DEBUG IMAP: startIdle: set to IDLE
DEBUG IMAP: startIdle: return true
DEBUG IMAP: IdleManager.watch startIdle succeeded for [folder]
DEBUG IMAP: IdleManager selected 0 channels
DEBUG IMAP: IdleManager adding [folder] to selector
DEBUG IMAP: IdleManager waiting...
DEBUG IMAP: IdleManager selected 1 channels
DEBUG IMAP: IdleManager selected folder: [folder]
DEBUG IMAP: handleIdle: set to RUNNING
DEBUG IMAP: IdleManager got exception for folder: [folder], THROW:
javax.mail.FolderClosedException: * BYE JavaMail Exception: java.io.IOException: Connection dropped by server?
at com.sun.mail.imap.IMAPFolder.handleIdle(IMAPFolder.java:3199)
at com.sun.mail.imap.IdleManager.processKeys(IdleManager.java:370)
at com.sun.mail.imap.IdleManager.select(IdleManager.java:281)
at com.sun.mail.imap.IdleManager.access$200(IdleManager.java:137)
at com.sun.mail.imap.IdleManager$1.run(IdleManager.java:164)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
DEBUG IMAP: IdleManager waiting...
20分钟后,程序发出了另一个&#34; NOOP&#34;,返回的状态为&#34; OK&#34;。该程序再次调用idleManager.watch(folder)
,此处错误日志重新出现Folder is not using SocketChannels
。
你还需要什么吗?这是图书馆的问题吗?