将javamail会话传输保持打开是否可以接受?

Ala*_*air 16 java jakarta-mail

我的应用程序需要临时发送电子邮件.我正在使用javamail的getDefaultSession和getTransport来发送消息,并且它都按预期工作.

但是我注意到发送可能需要很长时间 - 每次发送最多7秒.如果我打破了这些步骤,就像这样:

Transport transport = session.getTransport("smtp");
transport.connect();
transport.sendMessage( msg, addresses )
transport.close();
Run Code Online (Sandbox Code Playgroud)

...我可以看到,每次都是几乎所有时间的connect()调用.

我发现的所有例子都是这样做的 - 获得传输,连接,发送,断开连接.但当然,它们都是单拍的例子,或者只需一次通话即可发送大批电子邮件.

我以为我可以让连接保持打开状态,如下所示:

Transport transport = session.getTransport("smtp");
if (!transport.isConnected())
    transport.connect();
transport.sendMessage( msg, addresses )
Run Code Online (Sandbox Code Playgroud)

(这里有一个变种,这里:java邮件保持传输对象连接).

我最终必须在某种关闭钩子中关闭它.而且我可能必须有一个后备(如果连接丢失但传输没有实现).但有没有理由不在应用程序生命周期内将其保持开放状态?

谢谢,阿拉斯泰尔

Tom*_*ros 7

我没有看到保持单个SMTP连接打开的任何问题,建议使用传输对象进行连接重用(请参阅JavaMail教程).

另外,我建议你只在应用程序中打开一个smpt连接(通过Transport),将它保持在单个管理器实例(即使用单例模式),避免为每个组件保持不同连接的最终成本.需要发送消息.