Spring Boot Thymeleaf JavaMail - «ресурс пути к классу [images / lo go .png] не может быть открыт, потому что он не существует» с помощью streams.foreach - PullRequest
0 голосов
/ 14 апреля 2020

Я использую Spring Boot и Thymeleaf для отправки электронных писем. У меня есть одно встроенное изображение в качестве подписи в электронном письме. Все работает нормально, если я отправляю по одному письму за раз. Но мой вариант использования - отправить отдельное письмо списку получателей. Я могу сделать это без изображения. Но когда я добавляю изображение, первое электронное письмо отправляется, и во второй раз я получаю class path resource [images/tp-logo.png] cannot be opened because it does not exist.

  1. Когда я вызываю emailService.send () из stream.forEach (), я получить выше ошибка.
  2. Когда я вызываю его из нормального для l oop, он работает нормально.

Я понимаю, что потоки ленивы, но почему ресурс отсутствует ?

Рабочий код метода вызывающего абонента:

for(ContactIfo contact : contactInfoList) {
   ExecutorService emailExecutor = Executors.newCachedThreadPool();
   emailExecutor.execute(() -> {
       final String emailAddress = contact.getEmailAddress();
       if (StringUtils.isNotBlank(emailAddress)) {
          emailService.sendEmail(emailAddress);
       }
   });
 }         

Код метода вызывающего абонента:

contactInfoList.parallelStream().forEach(contact -> {
    ExecutorService emailExecutor = Executors.newCachedThreadPool();
    emailExecutor.execute(() -> {
        final String emailAddress = contact.getEmailAddress();
        if (StringUtils.isNotBlank(emailAddress)) {
            emailService.sendEmail(emailAddress);
        }
    });
});

Callee:

private void sendEmail(Mail mail) throws MessagingException {
    MimeMessage message = emailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message,
            MimeMessageHelper.MULTIPART_MODE_MIXED_RELATED,
            StandardCharsets.UTF_8.name());

    Context context = new Context();
    context.setVariables(mail.getProps());

    String html = templateEngine.process("me-event-update-template", context);

    helper.setText(html , true);
    helper.setTo(mail.getMailTo());
    helper.setSubject(mail.getSubject());
    helper.setFrom(mail.getFrom());
    // adding inline resources with matching cId to the variable name/value
    helper.addInline("logo", new ClassPathResource("images/logo.png"), "image/png");
    emailSender.send(message);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...