背景: 前天线上的tomcat突然挂了,一看原来网络连接超过了操作系统的限制
其实tomcat的压力也不大,并发也就20-30,怎么会造成这种情况,仔细观察发现好多
TCP连接Close_Wait, 这些连接都指向我们邮件中的附件资源,原来是我们发送带附件的邮件造成的
我们在发送邮件的程序中使用了URLDataSource,我在本地测试的时候也发现,在使用URLDataSource的情况下,确实会造成连接不关闭。
通过查看javamail的源代码,发现javamail也并非完全不关闭连接,在使用URLDataSource的时候会打开资源地址请求类型,也会通过流打开真正的资源,javamail获取资源后通过关闭流也关闭了资源的连接,但是获取资源类型的时候并未关闭连接
看看URLDataSource的源代码
-
publicStringgetContentType(){
-
Stringtype=null;
-
try{
-
if(url_conn==null)
- url_conn=url.openConnection();
-
}catch(IOExceptione){}
-
if(url_conn!=null)
- type=url_conn.getContentType();
-
if(type==null)
-
type="application/octet-stream";
-
returntype;
- }
URLDataSource并没有关闭类型连接的接口,所以一旦getContentType就没法关闭了,还好
javamail的URLDataSource还是很好扩展的,解决办法如下
-
publicclassXXURLDataSourceextendsURLDataSource{
-
publicXXURLDataSource(URLarg0){
-
super(arg0);
-
- }
-
publicStringgetContentType(){
-
Stringtype=null;
-
java.net.HttpURLConnectionurl_conn=null;
-
try{
-
-
url_conn=(java.net.HttpURLConnection)this
- .getURL().openConnection();
-
}catch(IOExceptione){
- }
-
if(url_conn!=null){
- type=url_conn.getContentType();
- url_conn.disconnect();
- }
-
if(type==null)
-
type="application/octet-stream";
-
returntype;
- }
- }
(这段程序仅支持
http的资源类型,其他类型资源请自行解决)
产生一个类,继承URLDataSource ,并覆盖getContentType函数,然后在调用的地方把
URLDataSource 变为XXURLDataSource即可,本地测试没有问题,然后放在线上测试
发了3000封带附件的程序,系统fd一度高达3100+,后来在半小时内,fd逐渐回收,fd降到数百的正常水平,改造算是基本成功了
分享到:
相关推荐
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,该版本解决了1.5.x版本上qq邮箱根据uid获取message对象为空的解析bug
基于Javamail的邮件收发系统(系统) https://blog.csdn.net/dearmite/article/details/131799642 2023年8月验证,无BUG 本系列校训 用免费公开视频,卷飞培训班哈人!打死不报班,赚钱靠狠干! 只要自己有电脑,...
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...
BugzeroTM 是一个多功能,基于网络 (Web-based) 并在浏览器 (Browser) 下运行的以工作流为中心的集成式业务流程... Bugzero 6.5.3 发布,该版本升级 JavaMail 到 javamail-1.4.5,更好处理连接远程邮箱的错误问题。
本程序是使用Javamail API和Jacob Office操作库编写的批量发送实名邀请函的Java程序。 1、不仅可以提供全功能的邮件发送功能: - 发送常规邮件(邮件主题、发送地址、接收地址、邮件正文) - 邮件群发 - ...
(4)Bug的查找以及页面的美化。 5.订单以及javamail、POI模块:分别关联分店表,库存表,员工表,用户表,顾客表,供应商表,花材表,分为供应商订单和顾客订单 (1)顾客订单,顾客新增时可以新增鲜花订单,通过...
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_...
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-...
" "J2EE "1、JavaBean、Servlet、JNDI、JavaMail、JSP、JDBC、EJB、Stru" " "ts、Hibernate、JTA、JTS、JMS、Spring、Web Service; " " "2、流程控制、数组、异常处理和面向对象编程; " " "3、集合框架、线程、...