2010-10-27 87 views
1

通过javamail发送邮件时,会打开一个到smtp服务器的套接字。现在,我们得到了这样一个例子,即当连接仍然活着并且javamail正在等待服务器(垃圾邮件扫描需要几秒钟)时,邮件服务器的连接断开。因此,TCP连接从未真正关闭,客户端死锁。Javamail在超时时没有完全关闭套接字

因此,我们决定使用javamails超时,它的工作原理 - 客户端在指定的时间后抛出异常。但是,tcp连接没有正确关闭(netstat -np仍将连接显示为“ESTABLISHED”)。只有在我调用System.gc()后,套接字才会关闭。

这是一个问题,因为任何OOM,抛出异常之前GC()得到了保证,但不能达到FD-限制之前...

这个问题能以某种方式规避或者这是一个错误JavaMail的?

受影响的系统:Linux(Debian的莱尼),太阳JDK 1.6.0.20(与-XXUseSSE = 3),JavaMail的1.4.3

+0

读取超时不一定是致命的。对于JavaMail来说,决定其他方式并关闭连接将是一个错误的特性。是你的决定。 – EJP 2014-05-04 07:36:35

+0

如果我指定超时,则库将遵守此超时,取消读取并返回异常。从java的角度来看,一切都很好。只有插座没有关闭。只有在垃圾收集之后,套接字才会被释放。这意味着该库缺少对“close()”的调用......我需要能够保护系统资源并释放套接字,即使没有执行手动gc() - 特别是可能会禁用的gc()。 – 2014-05-18 20:32:39

回答

2

的异常不会导致连接被关闭,你必须调用Transport.close() 自己。