Статьи

Отслеживание исключений — часть 4 — отправитель почты Spring

Если вы читали любой из предыдущих блогов в этой серии, вы, возможно, помните, что я разрабатываю небольшое, но почти промышленное приложение, которое ищет в файлах журналов исключения. Вы также можете помнить, что у меня теперь есть класс, который может содержать целую кучу результатов, которые нужно будет отправить любому, кому интересно. Это будет сделано путем реализации моего простого интерфейса Publisher показанного ниже.

1
2
3
4
public interface Publisher {
 
  public <T> boolean publish(T report);
}

Если вы помните, требование было:

1
7 . Publish the report using email or some other technique.

В этом блоге я рассматриваю конкретную часть требования: отправка отчета по электронной почте. Поскольку это приложение 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, вам понадобится следующая запись в вашем POM-файле Maven:

1
2
3
4
5
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4</version>
</dependency>

Это гарантирует, что базовые классы Java Mail доступны для вашего приложения.

После того, как классы Java Mail настроены в сборке, необходимо установить конфигурацию Spring XML.

01
02
03
04
05
06
07
08
09
10
11
12
<!-- 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: mailSender и mailMessage . mailSender — это экземпляр JavaMailSenderImpl настроенный для использования определенного почтового SMTP-сервера, со всеми другими свойствами, такими как порт TCP, оставленными по умолчанию.

Вторым компонентом Spring является mailMessage , экземпляр SimpleMailMessage . На этот раз я предварительно настроил три свойства: «to», «from» и «subject». Это потому, что, будучи автоматическими сообщениями, эти значения всегда идентичны.

Конечно, вы можете настроить их программно, что вам, вероятно, понадобится, если вы создаете почтовый графический интерфейс.

Весь этот XML делает реализацию Publisher очень простой.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@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 .

С точки зрения разработки кода, вот и все. Следующим шагом является сортировка расписания, чтобы отчет был создан вовремя, но об этом позже …

Если вы хотите посмотреть другие блоги этой серии, загляните сюда …

  1. Отслеживание исключений приложений с помощью Spring
  2. Отслеживание исключений в Spring — часть 2 — шаблон делегата
  3. Отчеты об отслеживании ошибок — часть 3 — стратегия и пакет