Прежде чем использовать Spring Boot, наш подход заключался в определении пула задач в файле конфигурации, а затем бросил аннотированную задачу @Async в пул задач для выполнения. Таким образом, в Spring Boot, как реализовать асинхронные вызовы задач, метод проще.
Давайте объединим предыдущий
Spring Boot Integrated JMS (реализация ActiveMQ)
Код в этом блоге реализован.
1. Описание функции
Когда потребитель слушает сообщение в очереди, он или она обрабатывает задачу, получающую сообщение как асинхронную задачу.
2. Модификация кода
Потребитель 1:
пакет com.chhliu.springboot.jms; Импорт org.springframework.jms.annotation.jmslistener; Импорт org.springframework.scheduling.annotation.async; Import org.springframework.stereotype.component; @Component Public Class Consumer {@jmslistener (destination = "mytest.queue") @Async // Этот метод будет выполнен асинхронно, что означает, что основной поток будет напрямую пропускать метод, но используйте поток в пуле потоков, чтобы выполнить метод public getCeequeeue (строковый текст) {System.out.print "+Текст); }}Потребитель 2:
пакет com.chhliu.springboot.jms; Импорт org.springframework.jms.annotation.jmslistener; Импорт org.springframework.messaging.handler.annotation.sendto; Import org.springframework.stereotype.component; @Component public class consumer2 {@jmslistener (destination = "mytest.queue") @sendto ("out.queue") public String receequeue (String Text) {System.out.println (Thread.currentThread (). GetName ()+": Сообщение, полученное Consumer2:"+Text); вернуть «возвращение сообщения»+текст; }}Добавьте следующую аннотацию в тестовый класс:
пакет com.chhliu.springboot.jms; Импорт javax.jms.destination; Импорт org.apache.activemq.command.activemqqueue; Импорт org.junit.test; Импорт org.junit.runner.runwith; Импорт org.springframework.beans.factory.annotation.autowired; Импорт org.springframework.boot.test.context.springboottest; Импорт org.springframework.scheduling.annotation.enableasync; Import org.springframework.test.context.junit4.springrunner; @Runwith (springrunner.class) @springboottest @enableasync // Включить асинхронные задачи для поддержки открытого класса Springbootjmsapplicationtests {@autowired частного продюсера; @Test public void contextloads () бросает прерывания {destination destination = new ActiveMqqueue ("mytest.queue"); for (int i = 0; i <100; i ++) {Produce.sendmessage (пункт назначения, "myname is chhliu !!!"); }}} 3. Результаты теста
DefaultmessageListenerContainer-1: Consumer2 получает: MyName-это chhliu !!! Ответное сообщение, полученное из очереди out.queue: return messagemyname is chhliu !!! SimpleAsynctaskexecutor-45: Сообщение, полученное потребителем: MyName-это chhliu !!! DefaultmessageListenerContainer-1: Consumer2 получает: MyName-это chhliu !!! Ответное сообщение, полученное из очереди out.queue: return messagemyname is chhliu !!! SimpleAsynctaskexecutor-46: Сообщение, полученное потребителем: myname is chhliu !!! DefaultmessageListenerContainer-1: Сообщение, полученное Consumer2: MyName IS CHHLIU !!! Ответное сообщение, полученное из очереди out.queue: return messagemyname is chhliu !!! SimpleAsynctaskexeCutor-47: Сообщение, полученное потребителем: MyName-это chhliu !!! DefaultmessageListenerContainer-1: Сообщение, полученное Consumer2: MyName IS CHHLIU !!! Ответное сообщение, полученное из очереди out.queue: return messagemyname is chhliu !!! SimpleAsynctaskexecutor-48: Сообщение, полученное потребителем: myname is chhliu !!! DefaultMessageListenerContainer-1: Consumer2: MyName IS chhliu !!! Ответное сообщение, полученное из очереди out.queue: return messagemyname is chhliu !!! SimpleAsynctaskexecutor-49: Сообщение, полученное потребителем: myname is chhliu !!! DefaultmessageListenerContainer-1: Сообщение, полученное Consumer2: MyName IS CHHLIU !!! Ответное сообщение, полученное из очереди out.queue: return messagemyname is chhliu !!! SimpleAsynctaskexecutor-50: Сообщение, полученное потребителем: myname is chhliu !!! DefaultmessageListenerContainer-1: Сообщение, полученное Consumer2: MyName IS CHHLIU !!!
Из приведенных выше результатов теста мы видим, что, поскольку потребитель 2 не использует метод асинхронной задачи, потребитель 2 потребляет сообщения, обрабатываемые фиксированным потоком DefaultmessagelistenerContainer-1. Потребитель 1 использует метод асинхронной задачи, и каждый раз, когда полученное сообщение обрабатывается другим потоком. Когда сообщение получено, задача бросается непосредственно в пул задач для обработки, и основной поток продолжает работать. Он также может быть выведен из результатов теста, что Spring Boot использует пул потоков NewCachedThreadPool по умолчанию.
Для конкретного использования пулов потоков, пожалуйста, обратитесь к другому сообщению от меня в блоге: //www.vevb.com/article/134870.htm
4. Асинхронные задачи вернулись
В реальном развитии мы часто сталкиваемся с ситуациями, когда возвращаются асинхронные задачи. Итак, как мы реализуем его в Spring Boot?
Ниже приведен пример асинхронной отправки электронной почты в качестве описания. Пример кода заключается в следующем:
@Async ("taskexecutepool") // Асинхронная задача будет представлена в пул задач TaskexeCutePool для выполнения публичного будущего <sonsect> dosendemail (mailInfo mailInfo) {// asynchronous ratement, используйте Future <sessonce> to asynchron ettive vog.info (thread.CurrentSthard (). Асинхронный метод Dosendemail Asynchronous! »); Sendmailsession session = null; Ответ res = новый ответ (); boolean isok = sendemail (mailInfo); // конкретный метод отправки электронных писем if (isok) {res.setSuccess (true); } else {res.setSuccess (false); } вернуть новый Asyncresult <sessonce> (res);Как использовать его после возвращения? Пример кода заключается в следующем:
Future <sessonce> result = taskjob.dosendemail (mailInfo); res = result.get (6, timeUnit.seconds);
Таким образом, вы можете получить возвращение асинхронной задачи!
Суммировать
Выше приведено метод реализации асинхронного (асинхронного) планирования задач Spring Boot. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!