javamail的bug

原创 2008年09月28日 17:05:00
 

背景: 前天线上的tomcat突然挂了,一看原来网络连接超过了操作系统的限制

其实tomcat的压力也不大,并发也就20-30,怎么会造成这种情况,仔细观察发现好多

TCP连接Close_Wait, 这些连接都指向我们邮件中的附件资源,原来是我们发送带附件的邮件造成的

 

我们在发送邮件的程序中使用了URLDataSource,我在本地测试的时候也发现,在使用URLDataSource的情况下,确实会造成连接不关闭。

 

通过查看javamail的源代码,发现javamail也并非完全不关闭连接,在使用URLDataSource的时候会打开资源地址请求类型,也会通过流打开真正的资源,javamail获取资源后通过关闭流也关闭了资源的连接,但是获取资源类型的时候并未关闭连接

看看URLDataSource的源代码

 

  1. public String getContentType() {
  2. String type = null;
  3. try {
  4.     if (url_conn == null)
  5. url_conn = url.openConnection();
  6. catch (IOException e) { }
  7. if (url_conn != null)
  8.     type = url_conn.getContentType();
  9. if (type == null)
  10.     type = "application/octet-stream";
  11. return type;
  12.     }

URLDataSource并没有关闭类型连接的接口,所以一旦getContentType就没法关闭了,还好

javamail的URLDataSource还是很好扩展的,解决办法如下
  1. public class XXURLDataSourceextends URLDataSource {
  2. public XXURLDataSource(URL arg0) {
  3. super(arg0);
  4. // TODO Auto-generated constructor stub
  5. }
  6. public String getContentType() {
  7. String type = null;
  8. java.net.HttpURLConnection url_conn = null;
  9. try {
  10. // if (url_conn == null)
  11. url_conn = (java.net.HttpURLConnection) this
  12. .getURL().openConnection();
  13. catch (IOException e) {
  14. }
  15. if (url_conn != null) {
  16. type = url_conn.getContentType();
  17. url_conn.disconnect();
  18. }
  19. if (type == null)
  20. type = "application/octet-stream";
  21. return type;
  22. }
  23. }

(这段程序仅支持

http的资源类型,其他类型资源请自行解决)

 

产生一个类,继承URLDataSource ,并覆盖getContentType函数,然后在调用的地方把

URLDataSource 变为XXURLDataSource即可,本地测试没有问题,然后放在线上测试

发了3000封带附件的程序,系统fd一度高达3100+,后来在半小时内,fd逐渐回收,fd降到数百的正常水平,改造算是基本成功了

【Java邮件开发】4.JavaMail API的简单介绍和jar包准备

1.前言 我们之前通过使用命令行手工敲SMTP和POP3的指令,进行了邮件收发。 我们接下来使用Java来实现邮件的收发。 如果我们不依赖Java的邮件API,而是使用原生模拟SMTP和POP3指令...
  • u013517797
  • u013517797
  • 2017年05月02日 22:20
  • 1339

JavaMail基本使用

JavaMail基本使用基本概述 JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。我们可以基于J...
  • q547550831
  • q547550831
  • 2016年10月23日 20:10
  • 1145

JavaMail--基础类详解

一、JavaMail简介 JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。我们可以基于JavaMai...
  • ljheee
  • ljheee
  • 2016年08月07日 21:43
  • 1975

关于JavaMail在QQ邮件作为发件人出现的bug说明

JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。我们可以基于JavaMail开发出类似于Micros...
  • redarmy_chen
  • redarmy_chen
  • 2016年11月11日 15:48
  • 4944

javamail的一些小bug

在写用java开发邮箱发送的过程中遇到了某些问题,其实这些问题很简单,但是但是弄啦我一天。   真心累,都是公司的网络不给力,什么网络都限制害得我弄啦一天 在做的过程中有下面的一些bug....
  • penghao_1
  • penghao_1
  • 2015年11月17日 22:49
  • 239

TIPTOP javamail设定

  • 2018年01月17日 10:52
  • 1.21MB
  • 下载

java邮件实现jar包(Javamail)

  • 2017年10月27日 10:06
  • 603KB
  • 下载

SpringUseJavaMailSendEmail(spring使用javamail发送邮件的例子)

  • 2017年10月20日 09:57
  • 5.59MB
  • 下载

JavaMail 1.6.0 的官方例子

  • 2017年09月22日 12:15
  • 137KB
  • 下载

JavaMail1.6.0(0303解决低版本上QQ邮箱解析失败的问题)

  • 2017年04月06日 15:18
  • 637KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:javamail的bug
举报原因:
原因补充:

(最多只允许输入30个字)