使用Spring跟踪应用异常(4)— 用Spring发送邮件

如果已经读过本系列前面几篇文章,可能记得我正在开发一个搜索异常日志文件的应用,它比较小但几乎具备工业级强度。你可能还记得我现在有一个包含一大堆结果的类,要发送这些结果给对它们感兴趣的人,做到这点需要实现Publisher接口。

public interface Publisher {

  public <T> boolean publish(T report);
}

前面列出的需求:

7.用email或者其他技术发布报告

本篇博客将解决这个需求的具体实现:使用邮件发送报告。因为这是一个Spring应用,发送邮件最简单的方式就是使用Spring的邮件类。不同于Spring API的JdbcTemplate和JmsTemplate等模板类,Spring邮件类基于一些接口和实现类。这些接口包括:

1.MailSender
2.JavaMailSender继承MailSender
3.MailMessage

等,实现类包括:

1.JavaMailSenderImpl实现JavaMailSender
2.SimpleMailMessage实现MailMessage

小贴士:这些是“基础”类,你可以使用MimeMailMessage,MimeMailMessageHelper,ConfigurableMimeFileTypeMap和MimeMessagePreparator等类实现更加漂亮的、更复杂的邮件。

写代码之前,需要做项目配置。使用Spring的邮件类要在Maven POM文件中加入:

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4</version>
</dependency>

确保应用可以使用Java Mail相关类。

Java Mail相关类编译后,下一件事情就是Spring XML中作配置。

<!-- Spring mail configuration -->

     <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
          <property name="host" value="${mail.smtp.host}"/>
     </bean>

     <!-- this is a template message that we can pre-load with default state -->
     <bean id="mailMessage" class="org.springframework.mail.SimpleMailMessage">
          <property name="to" value="${mail.to}"></property>
            <property name="from" value="${mail.from}"/>
            <property name="subject" value="${mail.subject}"/>
     </bean>

应用为实现自动发送报告加入了两个Spring bean:mailSendermailMessagemailSenderJavaMailSenderImpl的实例,具有特定的SMTP邮件服务器以及其他属性,比如使用默认配置的TCP端口。

第二个Spring bean是mailMessage,它是SimpleMailMessage的实例,这里配置了’to’,'from’和’subject’三个属性,因为这些自动生成的信息总是相同的。

当然也可以编程配置这些信息,如果创建邮件GUI可能要做其他事情。

有了所有这些XML配置,Publisher的实现就非常简单。

@Service
public class EmailPublisher implements Publisher {

  private static final Logger logger = LoggerFactory.getLogger(EmailPublisher.class);

  @Autowired
  private MailSender mailSender;

  @Autowired
  private SimpleMailMessage mailMessage;

  @Override
  public <T> boolean publish(T report) {

    logger.debug("Sending report by email...");
    boolean retVal = false;
    try {
      String message = (String) report;
      mailMessage.setText(message);
      mailSender.send(mailMessage);
      retVal = true;
    } catch (Exception e) {
      logger.error("Can't send email... " + e.getMessage(), e);
    }

    return retVal;
  }

}

Publisher类有一个方法:publish,泛型参数T report,正如我前面已经说过的,它的类型必须与前面博客中Formatter实现类返回参数的类型相同。

这段代码仅有三个步骤要考虑:首先泛型T被转换为String(需要考虑如果参数T report不是String的情况)。

第二步是将邮件内容附加到mailMessage,然后用mailSender.send(…)发送信息。

最后返回完成Publisher的标志true,如果邮件发送失败,异常记录在日志中,返回值为false

以上就是应用的代码。下一步为使日志信息条理清楚需要按时生成报告,更多内容请关注后续博客。

原文链接: javacodegeeks 翻译: ImportNew.com - hejiani
译文链接: http://www.importnew.com/11017.html
[ 转载请保留原文出处、译者和译文链接。]

关于作者: hejiani

(新浪微博:@jianihe

查看hejiani的更多文章 >>



相关文章

发表评论

Comment form

(*) 表示必填项

还没有评论。

跳到底部
返回顶部