为了账号安全,请及时绑定邮箱和手机立即绑定

并发发送带有附件的 HtmlEmail 和“​​打开的文件太多”错误

并发发送带有附件的 HtmlEmail 和“​​打开的文件太多”错误

qq_遁去的一_1 2021-06-17 18:49:50
我怀疑我使用了错误的 Apache Common Email 库来发送带有附件的电子邮件。有时我会收到“打开的文件太多”错误,如果我用lsof检查打开的文件,我会看到附件文件被多次打开:image1.png image2.png image1.png ...所以我怀疑我没有正确释放文件(或没有关闭某些资源)。也可能是软件工作正常,但如果外部 SMTP 服务器失败(连接异常),我的代码不会释放一些资源。来源:/* Async Thread to send email */Thread t = new Thread(){@Overridepublic void run(){      try{         task(request,idNewsletter);      }      catch (Exception e){         log.error("Error " + e);      }}};t.start();[...]任务方法:    ExecutorService executor = Executors.newFixedThreadPool(10);    [...]    List<Future<Integer>> list = new ArrayList<Future<Integer>>();    for (int i = 0; i < dests.length; i++) {                HtmlEmail htmlEmail = getHtmlMail([...]);        ArrayList<InternetAddress> dest = new ArrayList<InternetAddress>();        InternetAddress add = new InternetAddress();        add.setAddress(dests[i]);        dest.add(add);        htmlEmail.setBcc(dest);                 htmlEmail.setMailSession(getEmailSession());                    htmlEmail.buildMimeMessage();        Callable<Integer> worker = new EmailService(htmlEmail,i);                Future<Integer> future = executor.submit(worker);                    list.add(future);    }    try {        executor.shutdown();        executor.awaitTermination(28800, TimeUnit.SECONDS);    }    catch (InterruptedException e) {       log.error("Error=" + e);    }    finally {        if (!executor.isTerminated()) {            log.error("Task cancelled");        }        executor.shutdownNow();    }
查看完整描述

2 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

更新:即使我将字段重写为非静态,问题仍然存在。我想这是这个版本的库(Apache Common Email 1.5)的问题(bug?)


查看完整回答
反对 回复 2021-06-30
  • 2 回答
  • 0 关注
  • 143 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信