Java Mail:会话

11
以下是连接和执行IMAP文件夹操作的代码。 所以我的问题是关于javax.mail.Session,在这种情况下,它将每秒重新创建一次(取决于睡眠时间和checkInbox()运行时间)。
我确定这不是一个好的解决方案,特别是在IMAP上轮询有点愚蠢,但我无法使IMAP监听器运行。
不是每次运行都重新创建会话可能是更好的解决方案,但我如何知道何时关闭会话或者我可以有意关闭它吗?但是没有像Session.close()这样的东西,那么会话是否为NULL?或者会话是否有定义的超时时间... 来源:
final String port = "993";

Properties prop = new Properties();

// I assume there is some redundancy here but this didn't cause any problems so far
prop.setProperty("mail.imaps.starttls.enable", "true");
prop.setProperty("mail.imaps.port", port);

/** This part can be removed
 * prop.setProperty("mail.imaps.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
 * prop.setProperty("mail.imaps.socketFactory.port", port); 
 * prop.setProperty("mail.imaps.socketFactory.fallback", "false"); 
 */
prop.setProperty("mail.imap.ssl.enable", "true");
prop.setProperty("mail.debug", "false");

// Create a session before you loop since the configuration doesn't change
Session session = Session.getInstance(prop);

// Nearly loop forever in Prod
while(true){

    // Check the INBOX and do some other stuff
    Store store = session.getStore("imaps");
    store.connect(host, user, pw);

    // ... the operations on the session ... 

    store.close();

// Sleep a bit try & catch removed
Thread.sleep(1000);
}

总的来说,我不得不说在javax.mail方面很难找到好的示例和文档(除了APIFAQ)。

1个回答

16

会话仅管理配置信息,不需要关闭。 只要您的配置不变,就可以在开始时创建会话并继续使用。

另一方面,连接很昂贵,需要应用程序仔细管理。 连接用于存储和每个打开的文件夹。 服务器或由于网络故障可以随时关闭连接。 如果连接未被积极使用,则应将其关闭。

您是否在JavaMail项目页面上找到了JavaMail规范和示例应用程序? 它们将有助于解决许多简单问题,但连接管理是更高级的问题。

哦,您可以删除所有套接字工厂部分,使您的应用程序更简单。


非常感谢。请查看上面源代码的编辑。希望现在它更好了,会话和连接处理得应该是正确的方式。 当我有时间时,我应该建立一个IMAP监听器来摆脱轮询。您有任何想法在哪里可以找到体面且最新的示例或指南吗? - Kuchi
我想在/javamail-samples/monitorint.java文件中找到了我要找的内容。看起来上次我浏览这个文件时没有足够的注意力。 - Kuchi
是的,那应该能让你开始了。 - Bill Shannon
我没有关闭商店,结果发现了一个错误信息“最大连接数...”,这是由于提供者设置的最大连接数为20。 - A.W.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接