【问题标题】:How can I interrupt IMAP's IDLE?如何中断 IMAP 的 IDLE?
【发布时间】:2010-11-22 11:57:59
【问题描述】:

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

我尝试在空闲线程上调用 Thread.interrupt()。什么都没发生。我的想法不多了。

【问题讨论】:

    标签: java multithreading jakarta-mail


    【解决方案1】:

    中止 IDLE 命令的正确方法是以下 sn-p。请注意,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();
    }
    

    【讨论】:

    • 您是否刚刚回答了一个已接受答案的 9 岁儿童?
    • 显然是的,因为我花了 1 天时间试图弄清楚为什么建议的答案不起作用。
    【解决方案2】:

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

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

    如果您需要重新启动idle(),只需重新运行线程!

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

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

    祝你好运

    【讨论】:

    • 我会投票支持这个答案,因为它简单、准确且内容丰富,我有点考虑使用外螺纹进行空转的可能性,但有点认为从设计上看会很丑,好吧,我想当涉及到多线程和类似的事情时,它一定很丑。所以总结一下,这个解决方案很好用,我懒得彻底分析链接中的例子,但我根据这篇文章进行了测试,我可以确认它很好用,到目前为止还没有发现任何缺点。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-01-21
      • 2011-03-27
      • 2012-07-06
      • 2010-11-07
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 2021-10-03
      • 2012-01-19
      相关资源
      最近更新 更多