소개
비즈니스 처리에서 일부 비즈니스는 비동기 방법을 더 합리적으로 사용합니다. 예를 들어, 특정 비즈니스 로직에서 일부 데이터는 Redis 캐시에 저장됩니다. 캐시는 보조 기능 일뿐입니다. 성공 또는 실패는 주요 사업에 근본적인 영향을 미치지 않습니다. 이 과정은 비동기 방법을 통해 수행 될 수 있습니다.
봄에는이 방법을 메소드에서 @async 주석을 설정하여 비동기 적으로 호출 할 수 있습니다. 즉,이 방법은 호출되면 즉시 반환되며,이 방법의 실제 실행은 Spring의 Taskexecutor로 넘겨집니다.
코드 예제
이 프로젝트는 일반적인 스프링 프로젝트, 스프링 구성 파일입니다.
<? xml 버전 = "1.0"alcoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans"xmlns : xsi = "http://ww.w.w3.org/2001/xmlschema-instance" xmlns : context = "http://www.springframework.org/schema/context"xmlns : task = "http://www.springframework.org/schema/task"xsi : schemalocation = "http://www.springframwork.org/schema/schema/schema http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/sprgingconxt.xt.xtd http://www.springframework.org/schema/task http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd ">-패키지 스캔-> <concentx : content : content-scan 기본 패키지 = "com.lzumetal.ssm"/> <!-비동기 작업 실행을위한 스레드 풀 TASKEXECUTOR-> <작업 : executor id = "myExecutor"pool-size = "5"/> <태스크 : 주석 중심 executor = "myExecutor"/>> </beans>
두 서비스 클래스 :
package com.lzumetal.ss.anotation.service; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.bean.beans.annotation.autowired; import org.springframework.stereotype; import java.util.concutioncutioncection; java.util.concurrent.future;/** * 비즈니스 서비스 */@servicepublic 클래스 비즈니스 서비스 {private static final logger log = loggerfactory.getLogger (businessService.class); @autowired 개인 캐시 서비스 캐시 서비스; public void dobusiness () {log.error ( "비즈니스를 다루기 시작"); cacheservice.cachedata (); log.error ( "comlete 서비스 작동"); } / *** 비동기 메소드 실행에 대한 반환 값을 가져옵니다* / public void dobusiness () executionException, InterruptedException {log.error ( "비즈니스를 다루기 시작하기"); Future <string> Future = Cacheservice.cachedatawithreturn (); log.error (future.get ()); //future.get () 메소드는 차단 log.error ( "comlete 서비스 작동"); }} 패키지 com.lzumetal.ss.anotation.service; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.scheduling.annotation.async; import org.springframework.scheduling.annotation.asyncresult; org.springframework.stereotyp.service; import java.util.concurrent.future; import java.util.concurrent.timeUnit;/*** 캐시 서비스*/@servicepublic class cacheservice {private static final logger = loggeractory.getLogger (cacheservice.getLogger); @async (value = "myExecutor") // taskexecutor를 지정하여 작업을 실행할 공개 void cachedata () {try {timeUnit.seconds.sleep (3L); } catch (InterruptedException e) {e.printstacktrace (); } log.error ( "캐시에 결과를 성공적으로 저장"); } @async public future <string> cachedatawithreturn () {try {timeUnit.seconds.sleep (3l); } catch (InterruptedException e) {e.printstacktrace (); } log.error ( "캐시에 결과를 성공적으로 저장"); // 반환 된 결과는 Asyncresult 클래스에 의해 감싸야합니다. 반환 New Asyncresult <> ( "Async Operation Success"); }}테스트 클래스 :
package com.lzumetal.ss.anotation.test; import com.lzumetal.ss.anotation.service.businessservice; import org.junit.test; import org.junit.runner.runwith; import org.springframework.beans.annotation.Autowize; org.springframework.test.context.contextconfiguration; import org.springframework.test.context.junit4.springjunit4classrunner; import java.util.concurrent.timeUnit; @runwith (springJunit4classRunner.class) @ConxtConfigation (loctonfigations = { "ClassPath : Spring-Context.xml"}) public class maintest {@autowired 개인 비즈니스 서비스 비즈니스 서비스; @test public void test ()는 InterruptedException {businessservice.dobusiness (); // 메인 스레드가 너무 일찍 끝나지 않도록하십시오. 그렇지 않으면 콘솔이 비동기 메소드 TimeUnit.seconds.sleep (5L)에서 출력 내용이 표시되지 않습니다. } @test public void testasyncreturn ()은 예외를 던져 {businessservice.dobusinesswithasyncreturn (); TimeUnit.seconds.sleep (5L); }}test () 메소드 실행 결과 :
22 : 20 : 33,207 Info Main Support.DefaultTestContextBootStrapper : 260- 위치에서로드 된 기본 테스트 텍스트 리스트너 클래스 이름 [meta -inf/spring.factories] : [org.springframework.test.context.web.servlettestestexecutionListener, org.springframework.test.context.support.dirtiescontextbeforemodestestexecutionlistener, org.springframework.test.test.test.test.support.dependencyInjectStestexecutionListener, org.springframework.test.support.dirtiesttiesttextextextecutiontecutionlistlistlisteListListListListeNTERTEN. org.springframework.test.context.transaction.transactionalTestExecutionListener, org.springframework.test.context.jdbc.sqlscriptStestExecutionListener]
22 : 20 : 33,226 Info Main Support.DefaultTestContextBootstrapper : 209- TestExecutionListener를 인스턴스화 할 수 없습니다 [org.springframework.test.web.servlettestexecutionlistener]. 사용자 정의 청취자 클래스를 지정하거나 기본 청취자 클래스 (및 필요한 종속성)를 사용할 수 있도록하십시오. 문제 수업 : [Javax/Servlet/ServletContext]
22 : 20 : 33,227 Info Main Support.DefaultTestContextBootstrapper : 187- TestExecutionListeners 사용 : [org.springframework.test.context.support.dirtiescontextbeforemodestestexecutionListener@100fc185, org.springframework.test.context.support.dependencyInjectionsTestExecutionListener@643B1d11, org.springframework.test.context.support.dirtiescontextestestexecutionlistener@2ef5e5e3, org.springframework.test.context.transaction.transactionaltestexecutionlistener@36d4b5c, org.springframework.test.context.jdbc.sqlscriptStestestestestestestestexecutionlistener@6d00a15d] 22 : 20 : 33,324 Infor Main xml.xml.xmlefeReDer : 31324 클래스 경로 자원에서 XML Bean 정의로드 [Spring-Context.xml]
22 : 20 : 33,585 정보 메인 지원 .genericapplicationcontext : 583- 새로 고침 org.springframework.support.genericapplicationcontext@4f7d0008 : 시작 날짜 [수요일 5 월 30 일 22:20:33 CST 2018]; 컨텍스트 계층 구조의 근본
22 : 20 : 33,763 정보 메인 동시 동시. Threadpooltaskexecutor : 165- ExecutorService 초기화
22 : 20 : 33,766 정보 메인 지원. 포스트 프로스트 프로세서 레스트리스트 (PostProcessorregistrationDelegate $ BeanPostProcessOrchecker : 325- Bean 'myExecutor'유형 [org.springframework.scheduling.config.config.taskexecutoractorybean]에 의해 처리되는 데 적합하지 않습니다. 자동 입력)
22 : 20 : 33,767 정보 메인 지원. 포스트 프로스트 프로세서 레지스트레이션 $ BeanPostProcessOrchecker : 325- Bean 'MyExecutor'유형 [org.springframework.scheduling.concurrent.concurrent.concurrent. 자동 입력)
22 : 20 : 34,107 오류 Main Service.BusinessService : 24- 비즈니스 처리 시작
22 : 20 : 34,113 오류 메인 서비스
22 : 20 : 37,166 오류 MyExecutor -1 Service.CacheService : 28- 성공 저장 결과 캐시에 결과 저장
22 : 20 : 39,117 정보 스레드 -0 support.genericapplicationcontext : 984- org.springframework.support.genericapplicationcontext@4f7d0008 : 시작 날짜 [수요일 5 월 30:20:33 CST 2018]; 컨텍스트 계층 구조의 근본
22 : 20 : 39,118 정보 스레드 -0 동시. Threadpooltaskexecutor : 203- ExecutorService 종료
testasyncreturn () 메소드 실행 결과 :
21 : 38 : 16,908 정보 메인 지원 .DefaultTestContextBootStrapper : 260- 위치에서로드 된 기본 테스트 텍스트 리스트너 클래스 이름 [meta -inf/spring.factories] : [org.springframework.test.context.web.servlettestestexecutionlistener, org.springframework.test.context.support.dirtiescontextbeforemodestestexecutionlistener, org.springframework.test.test.test.test.support.dependencyInjectStestexecutionListener, org.springframework.test.support.dirtiesttiesttextextextecutiontecutionlistlistlisteListListListListeNTERTEN. org.springframework.test.context.transaction.transactionalTestExecutionListener, org.springframework.test.context.jdbc.sqlscriptStestExecutionListener]
21 : 38 : 16,926 Info Main Support.DefaultTestContextBootstrapper : 209- TestExecutionListener를 인스턴스화 할 수 없습니다 [org.springframework.test.context.web.servlettestexecutionlistener]. 사용자 정의 청취자 클래스를 지정하거나 기본 청취자 클래스 (및 필요한 종속성)를 사용할 수 있도록하십시오. 문제 수업 : [Javax/Servlet/ServletContext]
21 : 38 : 16,927 Info Main Support.DefaultTestContextBootstrapper : 187- TestExecutionListeners 사용 : [org.springframework.test.context.support.dirtiescontextbeforemodestestexecutionListener@100fc185, org.springframework.test.context.support.dependencyInjectionsTestExecutionListener@643B1d11, org.springframework.test.context.support.dirtiescontextestestexecutionlistener@2ef5e5e3, org.springframework.test.context.transaction.transactionaltestexecutionlistener@36d4b5c, org.springframework.test.context.jdbc.sqlscriptStestestestestestestexecutionListEner@6d00a15d] 21 : 38 : 17,025 정보 main xml.xml.xml.xml.xml.xml.xmleDeReTer : 31,025 클래스 경로 자원에서 XML Bean 정의로드 [Spring-Context.xml]
21 : 38 : 17,263 정보 메인 지원 .genericapplicationcontext : 583- 새로 고침 org.springframework.context.support.genericapplicationcontext@4f7d0008 : 시작 날짜 [수요일 5 월 30:38:17 CST 2018]; 컨텍스트 계층 구조의 근본
21 : 38 : 17,405 정보 메인 동시 동시. Threadpooltaskexecutor : 165- ExecutorService 초기화
21 : 38 : 17,407 정보 메인 지원. 포스트 프로세스 선수 등록 표시 $ BeanPostProcessOrchecker : 325- Bean 'MyExecutor'유형 [org.springframework.scheduling.config.config.taskexecutoractorybean]에 의해 처리 될 수는 없습니다 (예 : 예 : 예 : 예 : 자동 입력)
21 : 38 : 17,407 정보 메인 지원. 포스트 프로스트 프로세서 레지스트레이션 $ BeanPostProcessOrchecker : 325- Bean 'MyExecutor'유형 [org.springframework.scheduling.concurrent.concurrent.concurrent.threadpooltaskexexecutor]에 의해 처리 할 수 없음 (예 : 예정). 자동 입력)
21 : 38 : 17,692 오류 Main Service.BusinessService : 35- 비즈니스 처리 시작
21 : 38 : 20,833 오류 MyExecutor -1 Service.CacheService : 39- 성공 저장 결과 캐시에 결과 저장
21 : 38 : 20,834 오류 Main Service.BusinessService : 37- 비동기 작동 성공
21 : 38 : 20,835 오류 메인 서비스 .BusinessService : 38- 완전한 서비스 작동
21 : 38 : 25,838 정보 스레드 -0 support.genericapplicationcontext : 984- org.springframework.support.genericapplicationcontext@4f7d0008 : 시작 날짜 [수요일 5 월 30 일 21:38:17 CST 2018]; 컨텍스트 계층 구조의 근본
21 : 38 : 25,839 정보 스레드 -0 동시. Threadpooltaskexecutor : 203- ExecutorService 종료
@async의 사용 포인트
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.