SpringBoot 비동기 방법 캡 처 이상 상세 설명

본 논문 의 사례 는 SpringBoot 비동기 방법 으로 이상 을 포착 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
프로젝트 의 타이머 가 모두 비동기 실행 방식 을 사용 하기 때문이다.
정기 적 으로 비동기 방법의 집행 진도,이상 상황 을 감시 해 야 한다
1 실행 진도
실행 여 부 를 설정 할 수 있 습 니 다.메모리 에 실행 표 지 를 추가 하면 됩 니 다.
여러 번 의 실행 을 방지 하려 면 차단 기 를 통 해 이 를 판단 하고 여러 번 의 타이머 가 실행 되 는 것 을 방지 할 수 있다.
2 이상 포착
비동기 방법의 집행 이상 여 부 를 감시 하 다.
1 반환 값 없 음
AsyncExceptionConfig 클래스 를 설정 하여 통일 적 으로 처리 합 니 다.
이상 포획 설정 클래스 AsyncExceptionConfig 를 정의 합 니 다.설정 클래스 에서 SpringAsyncExceptionHandler 방법 을 정의 하여 AsyncUncaughtExceptionHandler 인 터 페 이 스 를 실현 합 니 다.
코드 는 다음 과 같 습 니 다:

package cn.bwjf.config;


import cn.bwjf.common.constant.InitServiceIdEnum;
import cn.bwjf.common.tools.InitServiceUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;

/**
 * @description :        
 * @author : tizzy <br/>
 * @version : 1.0
 * @date 2019/9/21
 */
@Configuration
@Slf4j
public class AsyncExceptionConfig implements AsyncConfigurer {
 
 
 
 /**
 * @description :           
 * @author : tizzy
 * @version : 1.0
 */
 @Bean
 @Override
 public Executor getAsyncExecutor() {
 ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
 //        
 executor.setCorePoolSize(8);
 executor.setMaxPoolSize(16);
 executor.setQueueCapacity(64);
 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
  executor.setThreadNamePrefix("SpringAsyncThread-");
 
  return executor;
 }

 @Override
 public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
 return new SpringAsyncExceptionHandler();
 }

 class SpringAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
 @Override
 public void handleUncaughtException(Throwable throwable, Method method, Object... objects) {
 log.info("------  Async            ---------");

 //               
 String methodName = method.getName();
 log.info("         == {} " , methodName);
 
 //             。。。。

 log.info("------  Async            ---------");
 }
 }
}
2 반환 값 이 있 음
반환 값 은 AsyncResult 포장 으로 되 돌려 줍 니 다.
AsyncResult 는 Future 인터페이스의 하위 클래스 이기 때문에 future.get()을 통 해 반환 값 을 가 져 올 때 ExecutionException 을 캡 처 할 수 있 습 니 다.

@Async 
public Future<String> asyncMethod() { 
 
 try { 
 Thread.sleep(5000); 
 return new AsyncResult<String>("hello world !!!!"); 
 } catch (InterruptedException e) { 
 // 
 } 
 
 return null; 
} 
호출

 try {
 Future future = service.asyncMethod();
 future.get();
 } catch (ExecutionException e) {
 logger.error("exception occurs", e);
 } catch (InterruptedException e) {
 logger.error("exception occurs", e);
 }
Future 타 입 이 뭐 예요?
Future 는 구체 적 인 Runnable 또는 Callable 작업 의 실행 결 과 를 취소 하고 완료 여 부 를 조회 하 며 결 과 를 가 져 오 는 인터페이스 입 니 다.필요 할 때 get 방법 을 통 해 실행 결 과 를 얻 을 수 있 습 니 다.이 방법 은 작업 이 결과 로 돌아 올 때 까지 차단 합 니 다.
인터페이스 정 의 는 다음 과 같 습 니 다.

public interface Future<V> {

 boolean cancel(boolean mayInterruptIfRunning);
 boolean isCancelled();
 boolean isDone();

 V get() throws InterruptedException, ExecutionException;
 V get(long timeout, TimeUnit unit)
 throws InterruptedException, ExecutionException, TimeoutException;

}
그것 은 이러한 다섯 가지 방법 을 설명 한다.
cancel 방법 은 작업 을 취소 하 는 데 사 용 됩 니 다.작업 을 취소 하면 true 로 돌아 갑 니 다.작업 을 취소 하 는 데 실패 하면 false 로 돌아 갑 니 다.인자 mayInterrupt IfRunning 은 실행 중인 작업 을 취소 할 수 있 으 나 완료 되 지 않 은 작업 을 취소 할 수 있 는 지 여 부 를 표시 합 니 다.true 를 설정 하면 실행 중인 작업 을 취소 할 수 있 음 을 표시 합 니 다.작업 이 완료 되 었 다 면 mayInterrupt IfRunning 이 true 든 false 든 이 방법 은 false 로 돌아 갑 니 다.즉,완 료 된 작업 을 취소 하면 false 로 돌아 갑 니 다.작업 이 실행 중인 경우,mayInterrupt IfRunning 이 true 로 설정 되면 true 로 돌아 가 고,may Interrupt IfRunning 이 false 로 설정 되면 false 로 돌아 갑 니 다.만약 작업 이 아직 실행 되 지 않 았 다 면,mayInterrupt IfRunning 이 true 든 false 든 간 에 true 로 돌아 갈 것 입 니 다.
isCanceled 방법 은 작업 이 취소 되 었 는 지 여 부 를 표시 합 니 다.작업 이 정상적으로 완료 되 기 전에 취소 되면 true 로 돌아 갑 니 다.
isDone 방법 은 작업 이 완료 되 었 는 지,작업 이 완료 되면 true 로 돌아 갑 니 다.
get()방법 은 실행 결 과 를 얻 는 데 사 용 됩 니 다.이 방법 은 차단 이 생 겨 서 작업 이 끝 날 때 까지 기 다 렸 다가 돌아 갑 니 다.
get(long timeout,TimeUnit unit)은 실행 결 과 를 가 져 오 는 데 사 용 됩 니 다.지정 한 시간 내 에 결 과 를 얻 지 못 하면 null 로 돌아 갑 니 다.
즉,Future 는 세 가지 기능 을 제공 했다.
임무 완성 여 부 를 판단 하기;
작업 중단 가능;
작업 수행 결 과 를 가 져 올 수 있 습 니 다.
3.비동기 방법 중 업무
@Async 호출 중인 트 랜 잭 션 처리 메커니즘
@Async 레이 블 방법 과 함께@Transactional 레이 블 도 적 용 됩 니 다.데이터 베 이 스 를 호출 할 때 사무 관리 에 대한 통 제 를 할 수 없 는 이 유 는 비동기 처 리 를 바탕 으로 하 는 작업 이기 때문이다.
올 바른 방법
 어떻게 이런 조작 에 사무 관 리 를 추가 합 니까?트 랜 잭 션 관리 작업 이 필요 한 방법 을 비동기 방법 내부 에 배치 하고 내부 호출 방법 에@Transactional 을 추가 할 수 있 습 니 다.
예 를 들 면: 
방법 A,@Async/@Transactional 로 표 시 했 지만 사무 통제 의 목적 이 생 길 수 없습니다.
방법 B,@Async 로 표시 합 니 다.  B 에서 C,D 를 호출 했 고 C/D 는 각각@Transactional 로 표 시 했 으 며 사무 통 제 를 실현 할 수 있 는 목적 입 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기