`
isiqi
  • 浏览: 16052822 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

javamail的bug

阅读更多

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

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

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

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

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

看看URLDataSource的源代码

  1. publicStringgetContentType(){
  2. Stringtype=null;
  3. try{
  4. if(url_conn==null)
  5. url_conn=url.openConnection();
  6. }catch(IOExceptione){}
  7. if(url_conn!=null)
  8. type=url_conn.getContentType();
  9. if(type==null)
  10. type="application/octet-stream";
  11. returntype;
  12. }

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

javamail的URLDataSource还是很好扩展的,解决办法如下
  1. publicclassXXURLDataSourceextendsURLDataSource{
  2. publicXXURLDataSource(URLarg0){
  3. super(arg0);
  4. //TODOAuto-generatedconstructorstub
  5. }
  6. publicStringgetContentType(){
  7. Stringtype=null;
  8. java.net.HttpURLConnectionurl_conn=null;
  9. try{
  10. //if(url_conn==null)
  11. url_conn=(java.net.HttpURLConnection)this
  12. .getURL().openConnection();
  13. }catch(IOExceptione){
  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. returntype;
  22. }
  23. }

(这段程序仅支持

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

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

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

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

分享到:
评论

相关推荐

    JavaMail 1.6.1 Final Release

    The 1.6.1 release contains bug fixes and enhancements, including the following significant change: Define Java 9 module name - java.mail The full list of changes is here: ...

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

    JavaMail1.6.0,该版本解决了1.5.x版本上qq邮箱根据uid获取message对象为空的解析bug

    基于Javamail的邮件收发系统(系统)

    基于Javamail的邮件收发系统(系统) https://blog.csdn.net/dearmite/article/details/131799642 2023年8月验证,无BUG 本系列校训 用免费公开视频,卷飞培训班哈人!打死不报班,赚钱靠狠干! 只要自己有电脑,...

    p28412269_112040_MSWIN-x86-64.zip

    ORA-29532 ON JAVAMAIL API AFTER UPGRADE TO 11.2.0.4 17804361 SET COLLECTION TYPE AS A BIND VARIABLE IS VERY SLOW AFTER UPGRADE TO 11.2.0.4 18166577 JAVA STORED PROCEDURE FAILS WITH ORA-29532 IN 11.2...

    Bugzero(Bug跟踪管理系统) v6.5.3

    BugzeroTM 是一个多功能,基于网络 (Web-based) 并在浏览器 (Browser) 下运行的以工作流为中心的集成式业务流程... Bugzero 6.5.3 发布,该版本升级 JavaMail 到 javamail-1.4.5,更好处理连接远程邮箱的错误问题。

    Java编写的批量发送实名邮件程序,特别适合发送实名邀请函

    本程序是使用Javamail API和Jacob Office操作库编写的批量发送实名邀请函的Java程序。 1、不仅可以提供全功能的邮件发送功能: - 发送常规邮件(邮件主题、发送地址、接收地址、邮件正文) - 邮件群发 - ...

    ssm框架鲜花完整项目前台后台实现包含sql

    (4)Bug的查找以及页面的美化。 5.订单以及javamail、POI模块:分别关联分店表,库存表,员工表,用户表,顾客表,供应商表,花材表,分为供应商订单和顾客订单 (1)顾客订单,顾客新增时可以新增鲜花订单,通过...

    cxf+spring webservice jar包

    cxf-xjc-bug671-2.6.0.jar cxf-xjc-dv-2.6.0.jar cxf-xjc-runtime-2.6.0.jar cxf-xjc-ts-2.6.0.jar ehcache-core-2.5.1.jar FastInfoset-1.2.12.jar geronimo-activation_1.1_spec-1.1.jar geronimo-annotation_1.0_...

    cxf(jax-ws)+spring+hibernate整合包

    wsn-core-2.7.6.jar,cxf-xjc-boolean-2.6.2.jar,cxf-xjc-bug671-2.6.2.jar,cxf-xjc-dv-2.6.2.jar,cxf-xjc-runtime-2.6.2.jar,cxf-xjc-ts-2.6.2.jar,dom4j-1.6.1.jar,ehcache-1.2.3.jar,ehcache-core-2.5.1.jar,ejb3-...

    “桂林高新杯”软件设计大赛.doc

    " "J2EE "1、JavaBean、Servlet、JNDI、JavaMail、JSP、JDBC、EJB、Stru" " "ts、Hibernate、JTA、JTS、JMS、Spring、Web Service; " " "2、流程控制、数组、异常处理和面向对象编程; " " "3、集合框架、线程、...

Global site tag (gtag.js) - Google Analytics