Предисловие
Эта статья в основном представляет соответствующий контент об асинхронном призыве Spring Boot Integration Async. Это обменивается вашей ссылкой и обучением. Я не скажу многое ниже, давайте посмотрим на подробное введение вместе.
Что такое асинхронный звонок?
Асинхронные вызовы относительно синхронных вызовов. Синхронные вызовы относятся к выполняемой программе шаг за шагом в заранее определенном порядке. Каждый шаг должен быть выполнен до выполнения предыдущего шага. Асинхронные звонки не должны ждать выполнения предыдущей программы.
Асинхронный метод обработки
Как реализовать асинхронные звонки?
Многопользовательский состав - это ключевое слово, о котором многие думают. Да, многопоточный способ - это способ реализовать асинхронные вызовы.
В проектах, не являющихся пружинами, мы хотим, чтобы асинхронные вызовы использовали методы многопоточного, мы можем самостоятельно реализовать интерфейс, который можно реализовать или интегрировать класс потоков или использовать пул потоков исполнителей, предоставленный JDK1.5 или выше.
Strngboot предоставляет очень удобный способ выполнения асинхронных вызовов.
Следуйте официальному примеру
Введите код
зависимости Maven:
<parent> <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-parent </artifactid> <sersive> 1.5.3.release </version> </parent> <Dependencies> <Dependency> <groupD> org.springframework.boot </GroupId> <ratifactid> <group-boot-startr </Зависимость> </зависимости>
Начать класс: добавить аннотацию @enableasync
@Springbootapplication @enableasync public class application {public static void main (string [] args) {springapplication.run (application.class, args); }}Контроллер
Просто добавьте @Async Annotation в метод, который вам нужно выполнить асинхронно
@RestController @Requestmapping ("") public Class AsynctaskController {@RequestMapping ("" ") public String dotask () Throws urruptEdException {long currentTimeMillis = System.currentTimeMillis (); this.task1 (); this.task2 (); this.task3 (); Long CurrentTimemiLlis1 = System.CurrentTimeMiLlis (); возврат "задача общее потребление времени:"+(currentTimemiLs1-currentTimemilsis)+"ms"; } @Async public void task1 () throws urruptedException {long currentTimeMillis = System.currentTimeMillis (); Thread.sleep (1000); Long CurrentTimemiLlis1 = System.CurrentTimeMiLlis (); System.out.println ("Task1 TASCER OTEROD:"+(CurrentTimeMiLIS1-CurrentTimeMiLLIS)+"MS"); } @Async public void task2 () throws urruptedException {long currentTimeMillis = System.currentTimeMillis (); Thread.sleep (2000); Long CurrentTimemiLlis1 = System.CurrentTimeMiLlis (); System.out.println ("Task2 Task Trake-Contring:"+(CurrentTimemilis1-currentTimeMillis)+"ms"); } @Async public void task3 () throws treamruptedException {long currentTimeMillis = System.CurrentTimeMillis (); Thread.sleep (3000); Long CurrentTimemiLlis1 = System.CurrentTimeMiLlis (); System.out.println ("task3 Task Trake-Contring:"+(currentTimemilis1-currentTimeMillis)+"ms"); }}Основная функция запускает проект Spirngboot. После завершения запуска, браузер Accesesses: http: // localhost: 8080/
Консоль:
Время задачи задачи: 1012 мс.
После ожидания вводится выход:
Общее время задачи: 6002 мс
Асинхронно не выполнено!
Может ли быть так, что код написан неправильно? Я проверял это несколько раз и не нашел очевидных ошибок. Я помню, что весна также имела аналогичные проблемы с @transactional Annotation. Когда пружина сканирует класс с помощью метода @transactional Annotation, создается класс прокси, и класс прокси запускается и закрывает транзакцию. В том же классе метод вызов выполняется в теле класса, а пружина не может перехватить этот вызов метода.
Внезапно поместите асинхронную задачу в класс отдельно и нарежьте код для ввода:
Контроллер
@Requestmapping ("") @RestController Public Class AsynctaskController {@autowired private asynctask asynctask; @Requestmapping ("" ") public String dotask () бросает прерывание {long currentTimeMiLlis = System.currentTimeMillis (); asynctask.task1 (); asynctask.task2 (); asynctask.task3 (); Long CurrentTimemiLlis1 = System.CurrentTimeMiLlis (); вернуть "задача Total Consuming:"+(CurrentTimeMiMillis1-currentTimeMillis)+"ms"; }} Асинхронный класс заданий
@Component public class asynctask {@Async public void task1 () throws urruptedException {long currentTimeMillis = System.currentTimeMillis (); Thread.sleep (1000); Long CurrentTimemiLlis1 = System.CurrentTimeMiLlis (); System.out.println ("Task1 Task Trake-Contring:"+(currentTimemilis1-currentTimeMillis)+"ms"); } @Async public void task2 () throws urruptedException {long currentTimeMillis = System.currentTimeMillis (); Thread.sleep (2000); Long CurrentTimemiLlis1 = System.CurrentTimeMiLlis (); System.out.println ("Task2 Task Trake-Contring:"+(CurrentTimemilis1-currentTimeMillis)+"ms"); } @Async public void task3 () throws treamruptedException {long currentTimeMillis = System.CurrentTimeMillis (); Thread.sleep (3000); Long CurrentTimemiLlis1 = System.CurrentTimeMiLlis (); System.out.println ("task3 Task Trake-Contring:"+(currentTimemilis1-currentTimeMillis)+"ms"); }}Консоль:
Время задачи задачи: 1012 мс.
Введите результаты браузера:
Общее время задачи: 19 мс
Асинхронный звонок преуспел!
Как узнать, когда выполняются три асинхронные задачи и каковы результаты выполнения? Вы можете использовать метод добавления обратного вызова FAAROAT
Код введен:
Асинхронный класс заданий
@Component public class asynctask {@Async public future <string> task1 () throws urruptedException {long currentTimeMiLs = System.currentTimeMillis (); Thread.sleep (1000); Long CurrentTimemiLlis1 = System.CurrentTimeMiLlis (); System.out.println ("Task1 Task Trake-Contring:"+(currentTimemilis1-currentTimeMillis)+"ms"); вернуть новый Asyncresult <string> ("выполнение Task1 завершено"); } @Async public future <string> task2 () throws urruptedException {long currentTimeMillis = System.currentTimeMillis (); Thread.sleep (2000); Long CurrentTimemiLlis1 = System.CurrentTimeMiLlis (); System.out.println ("Task2 Task Trake-Contring:"+(CurrentTimemilis1-currentTimeMillis)+"ms"); вернуть новый Asyncresult <String> ("выполнение Task2 завершено"); } @Async public future <string> task3 () throws urfuteException {long currentTimeMillis = System.CurrentTimeMillis (); Thread.sleep (3000); Long CurrentTimemiLlis1 = System.CurrentTimeMiLlis (); System.out.println ("task3 Task Trake-Contring:"+(currentTimemilis1-currentTimeMillis)+"ms"); вернуть новый Asyncresult <string> ("выполнение Task3 завершено"); }} Контроллер
@Requestmapping ("") @RestController Public Class AsynctaskController {@autowired private asynctask asynctask; @Requestmapping ("" ") public String dotask () бросает прерывание {long currentTimeMiLlis = System.currentTimeMillis (); Будущее <string> task1 = asynctask.task1 (); Будущее <string> task2 = asynctask.task2 (); Будущее <string> task3 = asynctask.task3 (); String result = null; for (;;) {if (task1.isdone () && task2.isdone () && task3.isdone ()) {// Все три задачи вызваны для завершения, выйдите из цикла и подождите для перерыва; } Thread.sleep (1000); } long CurrentTimeMiLlis1 = System.CurrentTimeMiLlis (); Результат = "Общее трудоемкое задания:"+(currentTimemilis1-currentTimeMillis)+"ms"; результат возврата; }}Вывод консоли:
Время задачи задачи: 1000 мс.
Вывод браузера:
Общее время задачи: 4015 мс
Асинхронный вызов успешным, и программа возвращает результат только после выполнения всех задач!
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.