Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javax.mail.Folder上的死锁_Java_Multithreading_Jakarta Mail_Imap_Deadlock - Fatal编程技术网

javax.mail.Folder上的死锁

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”);//

我有一个Java服务器应用程序,可以监控大量Gmail IMAP文件夹中的新邮件

它是用javamail IdleManager实现的。我已经安排了这样的任务(缩短的示例)

在多次运行之后,我遇到了一种死锁。 已同步文件夹。关闭(错误)将永远挂起

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.