Недавно я столкнулся с требованием, которое заключается в том, что когда сервер получает запрос, он не требует выполнения задачи, чтобы выполнить выполнение до возврата результата. Это может немедленно вернуть результат и позволить задаче выполнить асинхронно. Первое, что нужно рассмотреть, это запустить новый поток для выполнения задачи или отправить задачу в пул потоков для выполнения. Оба метода в порядке. Но пружина настолько мощная, что должен быть какой -то более простой метод. Я просто погуглил его, и это действительно имеет это. Просто используйте две аннотации @enableasync и @async, чтобы быть в порядке.
Добавить аннотацию @Async в метод
Пакет me.deweixu.aysncdemo.service; public interface asyncservice {void asyncmethod (String arg);} Пакет me.deweixu.aysncdemo.service.ipml; import me.deweixu.aysncdemo.service.asyncservice; импорт org.springframework.scheduling.Annotation.AsyncspablementsImmesmentsImmentsImmesmentServicsImmesmentsErmentsImmesmentSermentsImmesmentsImmesmentSermentsImmesmentSermentsImmesmentSermentsImmesmentSermentsImmesmentSermentsImmesmentSermentsImmesmentSermentsImmesmentSermentSium AsyncService {@Async @Override public void asyncMethod (String arg) {System.out.println ("arg:" + arg); System.out.println ("=====" + think.currentThread (). GetName () + "=======================);}} @Enableasync
Добавить аннотацию @enableasync в класс запуска или класс конфигурации
Пакет me.deweixu.aysncdemo; import org.springframework.boot.springapplication; импорт org.springframework.boot.autoconfigure.springbootapplication; импорт org.springframework.scheduling.annotation.enableasync;@ounableasync@springspplication@springsyncpplication@spensypplication@springaspplication@spensync AysncdemoApplication {public static void main (string [] args) {SpringApplication.run (aysncdemoApplication.class, args); }} тест
Пакет me.deweixu.aysncdemo; import me.deweixu.aysncdemo.service.asyncservice; import org.junit.test; импорт org.junit.runner.runwith; импорт org.springframework.beans.factory.annation.autowith; org.springframework.boot.test.context.springboottest; import org.springframework.test.context.junit4.springrunner; @runwith (springrunner.class) @springboottestpublic class -asyncservice; @Test public void testasync () {System.out.println ("=====" + thread.currentThread (). GetName () + "=============================================================================
2018-03-25 21: 30: 31.391 Информация 28742 --- [main] .saannotationAsyncexutionInterceptor: не найдено бобов задачи для асинхронной обработки: без боба типа TaskexeCutor и без бобов по имени Taskexecutor '
Арг: Асинхрон
===== SimpleAsynctaskexeCutor-1 =============
Из приведенных выше результатов AsyncService.asyncmethod («Async») действительно выполняется асинхронно, и он использует новый поток.
Укажите исполнителя
Из приведенного выше журнала выполнения вы можете догадаться, что Spring использует SimpleAsyNctaskexeCutor для асинхронного выполнения задач по умолчанию. Вы можете искать этот класс. @Async также может указать пользовательского исполнителя.
Добавить пользовательского исполнителя в класс запуска
Пакет me.deweixu.aysncdemo; import org.springframework.boot.springapplication; импорт org.springframework.boot.autoconfigure.springbootapplication; импорт org.springframework.context.nannotation.bean; imporm.springframework.shipeStaTration.nannas org.springframework.scheduling.concurrent.threadpooltaskexecutor; import java.util.concurrent.executor;@inableasync@springbootapplicationpublic class aysncdemoapplication {public Static Void main (string] rags). args); } @Bean (name = "threadpooltaskexecutor") public executor threadpooltaskexecutor () {return new threadpooltaskexecutor (); }}Укажите исполнителя
Пакет me.deweixu.aysncdemo.service.ipml; import me.deweixu.aysncdemo.service.asyncservice; импорт org.springframework.scheduling.Annotation.AsyncspablementsImmesmentsImmentsImmesmentServicsImmesmentsErmentsImmesmentSermentsImmesmentsImmesmentSermentsImmesmentSermentsImmesmentSermentsImmesmentSermentsImmesmentSermentsImmesmentSermentsImmesmentSermentsImmesmentSermentSium AsyncService {@Async ("ThreadPooltaskexeCutor") @Override public void asyncmethod (String arg) {System.out.println ("arg:" + arg); System.out.println ("=====" + Thread.currentThread (). GetName () + "========================================================================================Таким образом, используйте ThreadpooltaskexeCutor при выполнении задач асинхронно
Установите исполнителя по умолчанию
Как упомянуто выше, если @Async не указывает исполнителя, простойсинктексексутор используется по умолчанию. Фактически, исполнителя по умолчанию может быть настроен с использованием интерфейса AsyncConfigurer.
@ConfigurationPublic Class SpringAsyncconfig реализует Asyncconfigurer {@Override public executor getAsyncexecutor () {return new threadpooltaskexecutor (); }} Захват исключений
Исключения могут возникнуть в асинхронных методах выполнения. Мы можем использовать попытку завоевать задачу, чтобы справиться с исключениями. Когда задача бросает исключение, Spring также предоставляет метод для его улова.
Реализуйте интерфейс AsyncuncaughtexceptionHandler
открытый класс CustomAsyncexceptionHandler реализует AsyncuncaughtexceptionHandler {@Override public void harderuncaughtexception (бросаемый, метод метода, объект ... obj) {system.out.println ("Сообщение исключения -" + throwable.getMessage ()); System.out.println ("Имя метода -" + method.getName ()); for (объект Param: obj) {System.out.println ("Значение параметра -" + param); }}}Реализовать интерфейс AsyncConfigurer переписать метод getAsyncuncaughtexceptionHandler
@ConfigurationPublic Class SpringAsyncconfig реализует Asyncconfigurer {@Override public executor getAsyncexecutor () {return new threadpooltaskexecutor (); } @Override public asyncuncaughtexceptionHandler getAsyncuncaughtexceptionHandler () {return new CustomAsyncexceptionHandler (); }}Перепишите метод асинкметода, чтобы он сделал исключение
@Async @Override public void asyncMethod (String arg) {System.out.println ("arg:" + arg); System.out.println("=====" + Thread.currentThread().getName() + "=================); throw new NullPointerException(); }Результаты работы:
=================
Арг: Асинхрон
===== threadpooltaskexecutor-1 ============
Сообщение об исключении - Async NullPointerException
Имя метода - асинкметод
Значение параметра - асинхронность
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.