JAVA에서 Spring의 @Async 사용법 요약

6345 단어 javaSpring@Async
JAVA에서 Spring의 @Async 사용법 요약
인용: 자바 응용에서 절대 다수의 경우 동기화 방식을 통해 상호작용 처리를 실현한다.그러나 제3자 시스템과 상호작용을 처리할 때 응답이 느린 상황을 초래하기 쉽다. 이전에는 대부분 다중 루틴을 사용하여 이런 임무를 완성했다. 사실은spring3.x 이후에 @Async를 내장하여 이 문제를 완벽하게 해결했습니다. 본고는 @Async의 용법을 소개할 것입니다.
1. 비동기 호출은 무엇입니까?
비동기 호출을 설명하기 전에 동기화 호출의 정의를 살펴보자.동기화는 전체 처리 과정의 순서대로 실행되고 각 과정이 모두 실행되고 결과를 되돌려주는 것이다.비동기 호출은 호출된 명령만 보냈을 뿐, 호출자는 호출된 방법이 완전히 실행될 때까지 기다릴 필요가 없다.다음 절차를 계속 수행하는 것입니다.
예를 들어 어떤 호출에서 순서대로 A, B, C 세 가지 과정 방법을 호출해야 한다.만약 그들이 모두 동기화 호출을 한다면 그들을 모두 순서대로 실행한 후에 과정 실행이 끝난 것으로 간주해야 한다.만약에 B가 비동기적인 호출 방법이라면 A를 실행한 후에 B를 호출한다. B가 완성되기를 기다리지 않고 C를 호출하기 시작한다. C가 실행된 후에 이 과정의 실행이 끝났다는 것을 의미한다.
2. 일반적인 비동기 호출 처리 방식
자바에서 일반적으로 유사한 장면을 처리할 때 독립된 라인을 만들어서 해당하는 비동기 호출 논리를 완성하고 주 라인과 서로 다른 라인 간의 집행 절차를 통해 독립된 라인을 시작한 후에 주 라인이 계속 집행되고 정체된 기다림이 발생하지 않는다.
3. @Async 소개
Spring에서 @Async 마크업을 기반으로 하는 방법을 비동기 방법이라고 합니다.이 방법들은 실행될 때, 독립된 라인에서 실행될 것이며, 호출자는 그것의 완성을 기다리지 않아도 다른 조작을 계속할 수 있다.
Spring에서 @Async 활성화 방법
Java 구성 기반 활성화 방법:

@Configuration 
@EnableAsync 
public class SpringAsyncConfig { ... } 
XML 구성 파일 기반 활성화 방식은 다음과 같습니다.

<task:executor id="myexecutor" pool-size="5" /> 
<task:annotation-driven executor="myexecutor"/> 
이상은 두 가지 정의의 방식이다.
4. @Async 기반 반환값 호출 없음
예는 다음과 같습니다.

@Async //  
public void asyncMethodWithVoidReturnType() { 
  System.out.println("Execute method asynchronously. " 
   + Thread.currentThread().getName()); 
} 
사용 방식은 매우 간단하여 하나의 표시로 모든 문제를 해결할 수 있다.
5. @Async 반환값 기반 호출
예는 다음과 같습니다.

@Async 
public Future<String> asyncMethodWithReturnType() { 
  System.out.println("Execute method asynchronously - " 
   + Thread.currentThread().getName()); 
  try { 
    Thread.sleep(5000); 
    return new AsyncResult<String>("hello world !!!!"); 
  } catch (InterruptedException e) { 
    // 
  } 
  
  return null; 
} 
위의 예에서 알 수 있듯이 되돌아오는 데이터 형식은 Future 형식이고 인터페이스입니다.구체적인 결과 유형은 AsyncResult로 주의해야 할 부분이다.
결과를 되돌리는 비동기식 방법을 호출하는 예:

public void testAsyncAnnotationForMethodsWithReturnType() 
  throws InterruptedException, ExecutionException { 
  System.out.println("Invoking an asynchronous method. " 
   + Thread.currentThread().getName()); 
  Future<String> future = asyncAnnotationExample.asyncMethodWithReturnType(); 
  
  while (true) { /// ,  
    if (future.isDone()) { //  
      System.out.println("Result from asynchronous process - " + future.get()); 
      break; 
    } 
    System.out.println("Continue doing something else. "); 
    Thread.sleep(1000); 
  } 
} 
분석: 이러한 비동기 방법의 결과 정보는 Future의 상태를 끊임없이 검사하여 현재의 비동기 방법이 완성되었는지 확인하는 것이다.
6. @Async 호출에 기반한 이상 처리 메커니즘
비동기적인 방법에서 이상이 발생하면 호출자caller에게 감지할 수 없습니다.예외 처리가 필요한 경우 다음과 같이 처리합니다.
    1.AsyncTaskExecutor를 위한 작업 수행기 사용자 정의
여기서 구체적인 이상을 처리하는 논리와 방식을 정의합니다.
    2.내장된 작업 수행기를 사용자 정의 TaskExecutor로 대체 구성
예제 1단계, 사용자 정의 TaskExecutor

public class ExceptionHandlingAsyncTaskExecutor implements AsyncTaskExecutor { 
  private AsyncTaskExecutor executor; 
  public ExceptionHandlingAsyncTaskExecutor(AsyncTaskExecutor executor) { 
    this.executor = executor; 
   } 
   //// ,@Async  
  public void execute(Runnable task) {    
   executor.execute(createWrappedRunnable(task)); 
  } 
  public void execute(Runnable task, long startTimeout) { 
    / ,@Async  
    executor.execute(createWrappedRunnable(task), startTimeout);      
  }  
  public Future submit(Runnable task) { return executor.submit(createWrappedRunnable(task)); 
    // ,@Async 。 
  }  
  public Future submit(final Callable task) { 
   // ,@Async 。 
    return executor.submit(createCallable(task));  
  }  
   
  private Callable createCallable(final Callable task) {  
    return new Callable() {  
      public T call() throws Exception {  
         try {  
           return task.call();  
         } catch (Exception ex) {  
           handle(ex);  
           throw ex;  
          }  
         }  
    };  
  } 
 
  private Runnable createWrappedRunnable(final Runnable task) {  
     return new Runnable() {  
       public void run() {  
         try { 
           task.run();  
         } catch (Exception ex) {  
           handle(ex);  
          }  
      } 
    };  
  }  
  private void handle(Exception ex) { 
   //  
   System.err.println("Error during @Async execution: " + ex); 
  } 
} 
분석: 이것은 AsyncTaskExecutor를 실현하고 독립된 라인으로 구체적인 모든 방법을 실행하는 것을 발견할 수 있다.createCallable과createWrapperRunnable에서 이상한 처리 방식과 메커니즘을 정의했습니다.
handle () 은 미래에 우리가 주목해야 할 이상 처리의 곳이다.
구성 파일의 내용:

<task:annotation-driven executor="exceptionHandlingTaskExecutor" scheduler="defaultTaskScheduler" /> 
<bean id="exceptionHandlingTaskExecutor" class="nl.jborsje.blog.examples.ExceptionHandlingAsyncTaskExecutor"> 
  <constructor-arg ref="defaultTaskExecutor" /> 
</bean> 
<task:executor id="defaultTaskExecutor" pool-size="5" /> 
<task:scheduler id="defaultTaskScheduler" pool-size="1" /> 
분석: 이 설정은 부족한 TaskExecutor를 대체하기 위해 사용자 정의taskExecutor를 사용합니다.
7. @Async 호출 중인 트랜잭션 메커니즘
@Async 표기 방법과 @Transactional을 적용하여 표기했다.데이터베이스 조작을 호출할 때 사무 관리를 제어할 수 없는 이유는 비동기적인 처리를 바탕으로 하는 조작이기 때문이다.
그러면 어떻게 이런 조작에 사무 관리를 추가해야 합니까?사무 관리 작업이 필요한 방법을 비동기식 방법 내부에 배치하고 내부에서 호출되는 방법에 @Transactional을 추가할 수 있습니다.
예를 들어 방법 A는 @Async/@Transactional을 사용하여 표시하지만 사무 제어의 목적을 만들 수 없습니다.
방법 B는 @Async를 사용하여 표시했고 B에서 C, D를 호출했고 C/D는 각각 @Transactional을 사용하여 표시를 하면 사무 제어의 목적을 실현할 수 있다.
8. 총결산
이상의 설명을 통해 @Async가 사용하는 방법과 주의사항을 살펴볼 수 있습니다.
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기