javax.mail.Folder上的死锁
我有一个Java服务器应用程序,可以监控大量Gmail IMAP文件夹中的新邮件 它是用javamail IdleManager实现的。我已经安排了这样的任务(缩短的示例) 在多次运行之后,我遇到了一种死锁。 已同步文件夹。关闭(错误)将永远挂起javax.mail.Folder上的死锁,java,multithreading,jakarta-mail,imap,deadlock,Java,Multithreading,Jakarta Mail,Imap,Deadlock,我有一个Java服务器应用程序,可以监控大量Gmail IMAP文件夹中的新邮件 它是用javamail IdleManager实现的。我已经安排了这样的任务(缩短的示例) 在多次运行之后,我遇到了一种死锁。 已同步文件夹。关闭(错误)将永远挂起 Properties=newproperties(); Session Session=Session.getDefaultInstance(props,null); props.put(“mail.event.scope”、“session”);//
Properties=newproperties();
Session Session=Session.getDefaultInstance(props,null);
props.put(“mail.event.scope”、“session”);//或“应用程序”
道具放置(“mail.event.executor”,es);
props.setProperty(“mail.imaps.usesocketchannels”、“true”);
//在其他地方初始化。
//ArrayList folders=新建ArrayList();
用于(IMAPFolder文件夹:文件夹){
文件夹。关闭(false);
}
folders=newarraylist();
//在其他地方初始化。
//ArrayList stores=新的ArrayList();
适用于(门店:门店){
store.close();
}
stores=newarraylist();
//在其他地方初始化。
//ExecutorService es=Executors.newCachedThreadPool();
//IdleManager IdleManager=新的IdleManager(会话,es);
es=Executors.newCachedThreadPool();
if(idleManager!=null){
idleManager.stop();
}
idleManager=新的idleManager(会话,es);
//在这里,我在一个循环中运行许多线程。
下面是这些线程的简化示例
Store-Store=connectStore();
IMAPFolder文件夹=(IMAPFolder)store.getFolder(“收件箱”);
存储。添加(存储);
文件夹。添加(文件夹);
文件夹。打开(文件夹。只读);
idleManager.watch(文件夹);
我确信这是连接到IdleManager的,因为我在没有IdleManager.watch(文件夹)的情况下尝试了我的代码,一切正常
顺便说一句,我尝试过在Java中检测死锁,但它没有显示任何死锁
如果我从代码中删除close folder块并只关闭存储区,则情况相同。store.close()永远挂起,就像folder.close(false)一样
谢谢你的帮助!谢谢 我已经修复了许多与IdleManager相关的死锁bug。您使用的是最新的JavaMail 1.5.5吗?@BillShannon我使用的是1.5.4。现在我正在用1.5.5测试相同的代码,每次我都
idleManager.stop();idleManager=新的idleManager(会话,es);idleManager.watch(文件夹)
我得到了javax.mail.MessagingException:IdleManager没有在com.sun.mail.imap.IdleManager.watch(IdleManager.java:197)~[javax.mail-1.5.5.jar:1.5.5]
@BillShannon上运行,据我所知,这取决于IdleManager=新IdleManager(session,es)之间的时间间隔代码>和idleManager.watch(文件夹)代码>如果我处理此异常并尝试idleManager.watch(文件夹)代码>第二次-一切正常。IdleManager旨在确保长时间安全运行。您可以通过关闭文件夹,或对需要联系服务器的文件夹执行某些操作,然后在操作结束时不调用IdleManager.watch,从IdleManager中排除文件夹。是否设置任何超时属性?如果您想进一步调试,可以通过javamail与我联系_ww@oracle.com.