введение
В бизнес -обработке некоторые предприятия используют асинхронные методы более разумными. Например, в определенной бизнес -логике некоторые данные хранятся в кэше Redis. Кэш - это просто вспомогательная функция. Успех или неудача не окажут фундаментального влияния на основной бизнес. Этот процесс может быть выполнен с помощью асинхронного метода.
Весной метод может быть вызван асинхронно путем установки аннотации @Async на методе. То есть метод вернется сразу после вызова, и фактическое выполнение этого метода передается Taskexecutor Spring.
Пример кода
Проект - это обычный Spring Project, файл конфигурации Spring:
<? xml version = "1.0" Encoding = "UTF-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: context = "http://www.springframework.org/schema/context" xmlns: task = "http://www.springframework.org/schema/task" xsi: schemalocation = "http://wwww.springframe.orschema. http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd "> <! Base-package = "com.lzumetal.ssm"/> <!-Пул потоков для выполнения асинхронных задач TaskexeCutor-> <задача: Id Id = "myExecutor" pool-size = "5"/> <Задача: Annotation receortor = "myexecutor"/> </beans>
Два класса обслуживания:
пакет com.lzumetal.ssm.anotation.service; import org.slf4j.logger; импорт org.slf4j.loggerfactory; импорт org.springframework.beans.factory.annotation.autowired; импорт. java.util.concurrent.future;/** * Business Service */@ServicePublic Class BusinessService {Private Static Final Logger log = loggerFactory.getLogger (BusinessService.class); @Autowired Private Cacherervice Cachservice; public void dobusiness () {log.error («Начните иметь дело с нашим бизнесом»); cacheservice.cachedata (); log.error ("Операция службы Comlete"); } / *** Получить возвращаемое значение для асинхронного выполнения метода* / public void dobusinesswithasyncreturn () throws executionException, прерывание Exception {log.Error («Начните иметь дело с нашим бизнесом»); Будущее <string> future = cacheservice.cachedatawithreturn (); log.error (future.get ()); //future.get () метод - это блокирующий log.error ("Операция службы Comlete"); }} пакет com.lzumetal.ssm.anotation.service; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.scheduling.annotation.async; импорт org.springframework.scheduling.annotation.Asyncult; org.springframework.stereotype.service; import java.util.concurrent.future; import java.util.concurrent.timeunit;/*** service*/@servicepublic class cacheservice {private static final log log = loggerfactory.getlogger (cacheservice.clclice); @Async (value = "myExecutor") // Укажите TaskexeCutor, чтобы выполнить задачу public void cachedata () {try {timeUnit.seconds.sleep (3L); } catch (прерванное искусство e) {e.printstacktrace (); } log.Error ("Успех хранить результат в кеш"); } @Async public future <string> cachedataWithreturn () {try {timeUnit.seconds.sleep (3L); } catch (прерванное искусство e) {e.printstacktrace (); } log.Error ("Успех хранить результат в кеш"); // возвращаемый результат должен быть заверен в асинскрестольтском классе. Возврат новый Asyncresult <> («Async Operation Success»); }}Тестовый класс:
пакет com.lzumetal.ssm.anotation.test; import com.lzumetal.ssm.anotation.service.businessservice; import org.junit.test; импорт org.junit.runner.runwith; импорт org.sprimework.beans.Annotation.AutowWith; org.springframework.test.context.contextConfiguration; import org.springframework.test.context.junit4.springjunit4classrunner; import java.util.concurrent.timeUnit; @runwith (Springjunit4clunner.class) @contextconfigator (locations = = locations = = = {"ClassPath: Spring-context.xml"}) открытый класс maintest {@autowired Private BusinessService BusinessService; @Test public void test () бросает прерванную эксплуацию {businessservice.dobusiness (); // Не позволяйте основному потоку заканчиваться слишком рано, иначе консоль не увидит выходной контент в асинхронном методе TimeUnit.seconds.sleep (5L); } @Test public void testasyncreturn () бросает исключение {businessservice.dobusinesswithasyncreturn (); TimeUnit.seconds.sleep (5L); }}Результат выполнения метода test ():
22: 20: 33 207 Информация Основная поддержка.defaultTestContextBootStrapper: 260 - Загружено имена классов TestExeCutionListener по умолчанию. org.springframework.test.context.support.dirtiesContextBeForeModESteSectionListener, org.springframework.test.context.support.dependencyInctionteStexeCutionListener, org.springframework.test.context.transaction.transactionalTexeCutionListener, org.springframework.test.context.jdbc.sqlscriptSteStexcutionListener]
22: 20: 33,226 Информация Основная поддержка.defaulttestcontextbootStrapper: 209 - не может создать экземпляр TestexeCutionListener [org.springframework.test.context.web.servletteStexecutionListener]. Укажите пользовательские классы слушателей или предоставьте доступным классы слушателей по умолчанию (и их необходимые зависимости). Окончательный класс: [Javax/Servlet/ServletContext]
22: 20: 33,227 Информация Основная поддержка.defaultTestContextBootStrapper: 187 - Использование TestExeCutionListeners: [org.springframework.test.context.support.dirtiescontextBeForeSeSteSectionListerener@100fc185, org.springframework.test.context.support.dependencyInectionTeSteSectionListener@643b1d11, org.springframework.test.context.support.dirtiescontexttexecutistencework@2ef5e3, org.springframework.test.context.transaction.transactionaltexecutionlistener@36d4b5c, org.springframework.test.context.jdbc.sqlscriptSteStexeCutionListenerTeer@6def15d] 22: 20: 33,324 info. Определения из ресурса пути класса [spring-context.xml]
22: 20: 33 585 Информация Основная поддержка. GenericApplicationContext: 583 - Обновления org.springframework.context.support.genericApplicationContext@4f7d0008: Дата запуска [Ср 30 мая 22:20:33 CST 2018]; корень контекста иерархии
22: 20: 33,763 Информация Основное параллельное.
22: 20: 33,766 Информация Основная поддержка. PostprocessorgistrationDelegate $ beanpostprocessorchecker: 325 - Bean 'Myexecutor' типа [org.springframework.scheduling.config.taskexecutorfactore] не имеет права на то, что для All -All -Beanpesprespresprespress (например, не имеет права на то, что можно получить для All -Beanpost Автопроксимирование)
22: 20: 33 767 Информация Основная поддержка. PostprocessorgistrationDelegate $ beanpostprocessorchecker: 325 - Bean 'myexecutor' типа [org.springframework.scheduling.concurrent.threadpooltaskecutor] не подходит для получения обработанных для All -Beanpespresspresspresspresspresspostpresspostpresspostpresspostpresspostpresspostpresspostpress. Автопроксимирование)
22: 20: 34,107 Ошибка Основная служба. Бизнес -сервис: 24 - Начните иметь дело с нашим бизнесом
22: 20: 34,113 Ошибка Основная служба.
22: 20: 37,166 Ошибка MyExeCutor -1 Service.cacheservice: 28 - Успех хранить результат в кеш
22: 20: 39,117 Info Thread -0 Support.genericApplicationContext: 984 - Закрытие org.springframework.context.support.genericApplicationContext@4f7d0008: Дата запуска [Ср 30 мая 22:20:33 CST 2018]; корень контекста иерархии
22: 20: 39,118 Info Thread -0 CONGURRENT.THREADPOOLTASKEXECUTOR: 203 - ОТКЛЮЧЕНИЕ executorService
Результат выполнения метода testasyncreturn ():
21: 38: 16,908 Информация Основная поддержка.defaultTestContextBootStrapper: 260 - Загружено имена классов TestExeCutionListener по умолчанию. org.springframework.test.context.support.dirtiesContextBeForeModESteSectionListener, org.springframework.test.context.support.dependencyInctionteStexeCutionListener, org.springframework.test.context.transaction.transactionalTexeCutionListener, org.springframework.test.context.jdbc.sqlscriptSteStexcutionListener]
21: 38: 16 926 Информация Основная поддержка.defaulttestcontextbootStrapper: 209 - Не удалось создать экземпляр testexecutionListener [org.springframework.test.context.web.servlettestexecutionListener]. Укажите пользовательские классы слушателей или предоставьте доступным классы слушателей по умолчанию (и их необходимые зависимости). Окончательный класс: [Javax/Servlet/ServletContext]
21: 38: 16,927 Информация Основная поддержка.defaultTestContextBootStrapper: 187 - Использование TestExeCutionListenerers: [org.springframework.test.context.support.dirtiescontextBeForeSeSteStexCutionListener@100fc185, org.springframework.test.context.support.dependencyInectionTeSteSectionListener@643b1d11, org.springframework.test.context.support.dirtiescontexttexecutistencework@2ef5e3, org.springframework.test.context.transaction.transactionaltexecutionlistener@36d4b5c, org.springframework.test.context.jdbc.sqlscriptSteStexeCutionListerener@6d00a15d] 21: 38: 17,025 infoxectivelistenerteer @6defin. Определения из ресурса пути класса [spring-context.xml]
21: 38: 17 263 Информация Основная поддержка.genericApplicationContext: 583 - Обновления org.springframework.context.support.genericApplicationContext@4f7d0008: Дата запуска [Ср 30 мая 21:38:17 CST 2018]; корень контекста иерархии
21: 38: 17,405 Информация Основное параллельное.
21: 38: 17,407 Информация Основная поддержка. PostprocessorgistrationDelegate $ beanpostprocessorchecker: 325 - Bean 'Myexecutor' типа [org.springframework.scheduling.config.taskexecutorfactore] не имеет права на то, что для All -All -Beanpesprespresprespresspostprespostpresspostpresspostpresprescecutorybeabe не имеет права на то, что можно получить для All All -Beanpost Автопроксимирование)
21: 38: 17,407 Информация Основная поддержка. PostprocessorgistrationDelegate $ beanpostprocessorchecker: 325 - Bean 'Myexecutor' типа Автопроксимирование)
21: 38: 17 692 Ошибка Основная служба. БИССИНССЕРСЕР: 35 - Начните иметь дело с нашим бизнесом
21: 38: 20,833 Ошибка MyExeCutor -1 Service.Cacheservice: 39 - Успех хранить результат в кеш
21: 38: 20,834 Ошибка Основная служба. БИССИНССЕРСЕР СЕРВИСА: 37 - Асинхронная операция успех
21: 38: 20 835 Ошибка Основная служба. Служба Businessservice: 38 - Полная операция обслуживания
21: 38: 25,838 Информационная тема -0 Поддержка. GenericApplicationContext: 984 - Закрытие org.springframework.context.support.genericApplicationContext@4f7d0008: Дата запуска [Ср 30 мая 21:38:17 CST 2018]; корень контекста иерархии
21: 38: 25,839 Информация Thread -0 CONGURRENT.THREADPOOLTASKEXECUTOR: 203 - ОТКЛЮЧЕНИЕ executorService
@Точки использования Async
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.