我怎样才能中断IMAP的IDLE?

时间:2009-08-25 04:21:38

标签: java multithreading javamail

我正在使用连接到我的IMAP服务器的Javamail API。使用javax.mail.Folder.idle()method,一切都很顺利。当一个新邮件进来时,我的监听器会被调用。但是问题是永远是空闲块,我该如何打断它?如何在不杀死Java程序的情况下实际停止监听?

我试过在idle'd线程上调用Thread.interrupt()。什么都没发生。我的想法已经不多了。

3 个答案:

答案 0 :(得分:8)

对该文件夹(来自另一个线程)执行任何操作将导致idle()方法立即返回。因此,如果您想强制中断它,只需从新线程中调用close()

答案 1 :(得分:3)

如果您正确阅读文档并阅读源代码,您将意识到必须创建一个新线程来调用.idle()

将该线程分配给变量,并且只要您想在该线程上调用interrupt(),或者只是忽略通知!

如果您需要重新开始idle(),请重新运行主题!

我创造了类似的东西,所以你可能想看看它。

https://github.com/mofirouz/JavaPushMail/blob/master/src/main/java/com/mofirouz/javapushmail/JavaPushMailAccount.java

祝你好运

答案 2 :(得分:0)

中止IDLE命令的正确方法是以下代码段。请注意,Folder实例应与用于开始空闲的实例相同。我已经测试了在该线程上提出的其他解决方案,但在我的情况下它们不起作用。

IMAPFolder folder = store.getFolder("INBOX");
try {
  folder.doOptionalCommand("Abort IDLE error mesage", new IMAPFolder.ProtocolCommand() {
  @Override
  public Object doCommand(IMAPProtocol p) throws ProtocolException {
    p.idleAbort();
    return Boolean.TRUE;
  }
});
} catch (MessagingException e) {
  e.printStackTrace();
}