代码之家  ›  专栏  ›  技术社区  ›  yellowB

IMAPStore和IMAPFolder在JavaMail线程安全中吗?

  •  2
  • yellowB  · 技术社区  · 7 年前

    出身背景

    我将实现一个程序,从MS Exchange 2007服务器获取邮件。 由于架构设计,我必须运行多个线程(不是固定数量)才能连接到同一个邮箱;获取邮件的文件夹相同。

    JavaMail:1.5.6 交易所:2007年

    问题

    每个线程将获得一个电子邮件id,并使用 IMAPStore ,然后打开 IMAPFolder ,最后通过搜索email-id获取电子邮件。最后关闭 IMAPFolder公司 & IMAP存储 .

    当程序运行一段时间后,线程增加,我将得到以下异常:

    javax.mail.StoreClosedException: failed to create new store connection
    at com.sun.mail.imap.IMAPFolder.throwClosedException(IMAPFolder.java:3368)
    at com.sun.mail.imap.IMAPFolder.doCommand(IMAPFolder.java:3497)
    at com.sun.mail.imap.IMAPFolder.exists(IMAPFolder.java:560)
    at com.myco.myapp.MessageHandler.getFolder(MessageHandler.java:68)
    

    我想Exchange server上可能有连接限制,所以我问了Exchange管理员,他说(每个邮箱)的连接限制设置为16。

    然后我做了一个测试:

    1. IMAP存储
    2. IMAPFolder公司

    15号开赛后,我也遇到了同样的例外 IMAPFolder公司 试着打开第16个。

    我的问题

    我阅读了IMAPFolder的源代码,发现它的大部分功能是 synchronized . 只使用一个全局变量安全吗 IMAP存储 & IMAPFolder公司 多线程共享的对象?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Bill Shannon    7 年前

    从多个线程中使用IMAPStore或IMAPFolder是安全的,但每个打开的IMAPFolder都有一个到服务器的连接,因此您的并发性将受到该连接的限制。根据您对每条消息的处理方式,最好用一个线程打开文件夹,获取每条消息所需的所有信息,并将这些信息传递给线程池进行并行处理。