Отправка письма с весны в новой теме - PullRequest
6 голосов
/ 14 марта 2011

Одна из функций приложения, которое я разрабатываю, заключается в том, что электронное письмо отправляется каждый раз, когда пользователь получает свой счет, зарегистрированный в нашей системе.Отправка электронной почты из приложения Java очень проста, особенно при использовании Spring Framework.Я использую JavaMailSenderImpl и SimpleMailMessage из среды Spring, и все работает нормально.

Но мне нужно отправлять электронную почту в новом потоке, чтобы связь с SMTP-сервером не замедляла остальные процессы приложений.Проблема в том, что когда я вызываю метод

MailSender.send()

из новой темы, сообщение электронной почты не отправляется, в отличие от отправки в той же теме.Я пробовал с помощью @ Async аннотации Spring, Spring Executor и простого старого java.lang.Thread , но это не работает.

Может ли электронное письмо отправляться асинхронно в java с пружиной?У кого-нибудь была похожая проблема с этим?При необходимости я могу опубликовать несколько примеров кода.

Tnx

Ответы [ 4 ]

3 голосов
/ 06 января 2012

1) Добавить пространство имен задачи в контекст Spring. Следующий xsd предназначен для релиза Spring 3.0. xmlns:task="http://www.springframework.org/schema/task"

http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd

2) Объявите исполнителя в вашем весеннем контекстном файле.

<!--  Executor for the methods marked wiht @async annotations --> 
<task:executor id="asyncExecutor" pool-size="25" /> 

3) Сконфигурировать это для задачи Spring

<!--  Configuration for the Runtime --> 
<task:annotation-driven executor="asyncExecutor" /> 

Это все необходимые конфигурации в файле контекста Spring.

Метод, который необходимо выполнить для асинхронного аннотирования с помощью @Async annotaion.

Теперь все методы, аннотированные @async, будут обрабатываться асинхронно исполнителем задачи Spring.

3 голосов
/ 14 марта 2011

Это должно сработать.

Вы должны сказать Spring, что оно должно обратить внимание на вашу @Async Аннотация:to:

  • аннотированный метод должен принадлежать Spring Bean
  • вызов аннотированного метода должен выполняться из другого Spring Bean (если вы используете стандартный Spring AOP).
0 голосов
/ 28 января 2019

Вам необходимо включить функцию в Spring:

@EnableAsync
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}
0 голосов
/ 22 августа 2017

Одна из известных проблем выполнения кода в асинхронном потоке заключается в том, что исключения, сгенерированные этим кодом, теряются , если не предоставлен специальный обработчик для их перехвата .Эффект, который вы видите (а именно, метод @Async не может правильно выполнить и показать ключ к этому сбою в виде журнала или какой-либо трассировки стека), как правило, создается таким исключением, действительно выбрасывается, но проглатываетсяасинхронный поток.

Одна из многих возможных причин, по которым ваш метод @Async работает в синхронном режиме, заключается в том, что вы выполняете какую-то операцию с базой данных из метода.Он работает в синхронном режиме, потому что вы, вероятно, вызываете его из @Transactional метода другого @Service, поэтому для этого потока найден Session или EntityManager;но он не работает в асинхронном режиме, потому что в этом случае вы находитесь в новом потоке, и если метод @Async не является @Transactional, то нет Session или EntityManager, которые могли бы выполнить операцию.

TL; DR Предоставить обработчик исключений для перехвата исключений, которые в противном случае были бы поглощены асинхронным потоком, или для отладки используйте большую try / catch для тела метода @Async.Возможно, вы увидите какое-то исключение, тогда вам нужно будет предпринять соответствующие действия, чтобы избежать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...