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

new Thread().start内部类的使用场景?

new Thread().start内部类的使用场景?

繁华开满天机 2019-03-12 17:18:06
下面的这个方法是发邮件的抽象出来的一个公用方法:String[] to 表示收件人列表;subject  邮件主题;templateName 邮件末班,用velocity写的,Map params 参数,用来填充velocity中的某些字段取值的public void sendHtmlWithTemplate(String[] to, String subject, String templateName, Map<String, Object> params) {    final MimeMessage mimeMessage = mailSender.createMimeMessage();    try {        final MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);        messageHelper.setFrom(simpleMailMessage.getFrom());        if (ENV_ONLINE.equals(environment)) {            messageHelper.setTo(to);            messageHelper.setSubject(subject);        } else {            messageHelper.setTo(adminEmail);            messageHelper.setSubject(subject + Arrays.asList(to));        }        messageHelper.setSentDate(new Date());        final String content = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, templateName, "UTF-8",                                                                           params);        final String[] logTo = to;        messageHelper.setText(content, true);        new Thread() {            @Override            public void run() {                mailSender.send(mimeMessage);                logger.error("Mailsentto: " + Arrays.asList(logTo) + "\nContent: " + content);            }        }.start();    } catch (Exception e) {        logger.error("emailServiceError error:" + e.getMessage(), e);    }}在上面的发邮件的代码中,使用了内部类如下:new Thread() {    @Override    public void run() {        mailSender.send(mimeMessage);        logger.error("Mailsentto: " + Arrays.asList(logTo) + "\nContent: " + content);    }}.start();我觉得在这个地方做这个控制是很恰当的吧,为什么team leader让我删掉这个new Thread()的部分。原话:“把new Thread全部删掉,这些邮件发送不了的bug都没有暴露出来; 邮件发送模块的代码采用异步发送方式,失去异常事务回滚的能力,new Thread要全部删除;” 不懂是什么意思啊?问题:1.为什么要去掉new Thread()?2.在什么样的并发业务场景下,需要使用new Thread()这样的方式?有没有更好的解决方法?3.在并发场景下,使用new Thread().start()的方式有什么弊端?每次new Thread新建对象性能会很差么?邮件服务也是当触发某个业务规则的时候,可能需要大量发送一下邮件,用线程池好不好呢?
查看完整描述

4 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

匿名对象很方便,但匿名对象也是魔鬼,使用不好就能让你的应用崩塌。就拿你这里做例子,如果你没有控制好发送邮件的参数,比如发送时超时了就继续等待,那这个线程可就变成了孤魂野鬼了,找也找不到,关也关不掉,这是一个程序员该做的事情吗?
你问为何你的头让你把这里去掉,我只能说是他还不够相信的你能力,所以不敢让你操纵这个魔鬼。
你问什么场景下适合,我只能说没有适合的场景,只有有能力的人。

查看完整回答
反对 回复 2019-04-19
?
九州编程

TA贡献1785条经验 获得超4个赞

如果要发大量的邮件,可以做个队列,线程太多的话,恐怕不太好。


查看完整回答
反对 回复 2019-04-19
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

如果你有写过js,你可以理解这里的new Thread()相当于ajax请求,是属于异步行为,在这个线程任务还没执行完之前,方法已经返回给调用方了(而且不会抛出发送邮件产生的异常),这也就是你leader说的“这些邮件发送不了的bug都没有暴露出来”

考虑并发量大的话可以采用redis+kafka(或其他消息组件),用消息的形式去通知邮件服务发送邮件。


查看完整回答
反对 回复 2019-04-19
  • 4 回答
  • 0 关注
  • 7265 浏览

添加回答

举报

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