SpringBoot 비동기 방법 캡 처 이상 상세 설명
5577 단어 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 로 표 시 했 으 며 사무 통 제 를 실현 할 수 있 는 목적 입 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Java・SpringBoot・Thymeleaf】 에러 메세지를 구현(SpringBoot 어플리케이션 실천편 3)로그인하여 사용자 목록을 표시하는 응용 프로그램을 만들고, Spring에서의 개발에 대해 공부하겠습니다 🌟 마지막 데이터 바인딩에 계속 바인딩 실패 시 오류 메시지를 구현합니다. 마지막 기사🌟 src/main/res...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.