반응형

오늘은 프로젝트에서 적용한 일괄등록에서 사용한 @Async를 포스팅해볼게요.

월래는 Batch를 이용하여 새벽시간에 동작을 하도록 적용을 하였는데 @Async를 이용하여 빠르게 선처리 작업을 하고 이후 Async메서드를 호출하여 비동기 방식으로 작동하도록 구현을 하였습니다.

@Configuration
@EnableScheduling
@EnableAsync
public class AsyncThreadConfiguration {

	@Bean(name = "asyncExecutor")
	public Executor asyncThreadTaskExecutor() {
		ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
		threadPoolTaskExecutor.setCorePoolSize(2); //최초생성수
		threadPoolTaskExecutor.setMaxPoolSize(4); //max생성수
		threadPoolTaskExecutor.setThreadNamePrefix("fabs-batch-pool");

		return threadPoolTaskExecutor;
	}

	public class HandlingExecutor implements AsyncTaskExecutor {
		private final AsyncTaskExecutor executor;

		public HandlingExecutor(AsyncTaskExecutor executor) {
			this.executor = executor;
		}

		@Override
		public void execute(Runnable task) {
			executor.execute(createWrappedRunnable(task));
		}

		@Override
		public void execute(Runnable task, long startTimeout) {
			executor.execute(createWrappedRunnable(task), startTimeout);
		}

		@Override
		public Future<?> submit(Runnable task) {
			return executor.submit(createWrappedRunnable(task));
		}

		@Override
		public <T> Future<T> submit(final Callable<T> task) {
			return executor.submit(createCallable(task));
		}

		private <T> Callable<T> createCallable(final Callable<T> task) {
			return () -> {
				try {
					return task.call();
				} catch (Exception ex) {
					handle(ex);
					throw ex;
				}
			};
		}

		private Runnable createWrappedRunnable(final Runnable task) {
			return () -> {
				try {
					task.run();
				} catch (Exception ex) {
					handle(ex);
				}
			};
		}

		private void handle(Exception ex) {
			log.info("Failed to execute task. : {}", ex.getMessage());
			log.error("Failed to execute task. ", ex);
		}

		public void destroy() {
			if (executor instanceof ThreadPoolTaskExecutor) {
				((ThreadPoolTaskExecutor) executor).shutdown();
			}
		}
	}

먼저 ThreadPool설정입니다. 

setCorePoolSize 최초 생성 시 사용되는 Thread 수입니다.

setMaxPoolSize 생성할 수 있는 Thread Max값입니다. 

setThreadNamePrefix ThreadPool이 여러 곳에서 사용이 되면 알아볼 수 있도록 Name을 지정합니다.

@Bean(name = "asyncExecutor") <- "asyncExecutor"이름으로 비동기 호출을 사용할 수 있습니다.

//Controller Class
@RequestMapping(value = "/excelUpload", method = RequestMethod.POST)
public ResponseEntity<HttpResponse<?>> excelUpload(MultipartHttpServletRequest req, HttpServletResponse res,
    @AuthenticationPrincipal UserAuthentication userAuthentication) throws Exception {
    
    //비동기 Method호출
    Service.add(reqFundManagement);
    
    //비동기 Method 실행이 다 완료 안되더라도 이후 코드 실행
    
}

//Service Class

@Async("asyncExecutor")
public void add(ReqFundManagement reqFundManagement) {
    // 필요한 소스구현
}

기존 방식은

1) Excel업로드

2) 대상자 추출(LIST)

3) 대상자 등록

4) 대상자 API를 이용해 데이터 가져오기

대상자가 많을수록 3->4번이 대기 시간들이 길어져서 Batch로 만들려고 고민 중에 비동기 호출 방식 확인

비동기

1) Excel업로드

2) 대상자 추출(LIST)

3) 대상자 등록

4) 대상자 API를 이용해 데이터 가져오기

호출 순서는 같은데 3->4번 실행 후 4번 응답 대기 없이 바로 3->4가 반복을 하여 3번 대상자 먼저 등록이 되고 4번은  비동기로 작동이 돼서 여러 건을 동시에 가져와서 호출 시간이 절약이 되었어요.

 

반응형

'개발 > Java' 카테고리의 다른 글

Java Excel Upload  (0) 2021.02.25
이클립스 Formatter off  (0) 2021.02.16
Java 단방향,양방향 암호화  (1) 2021.01.25
Spring RestTemplate Converter오류  (0) 2021.01.14
List 중복 제거 및 List 정렬(Collections.sort)  (1) 2021.01.04
반응형

오랜만에 오전에 볼링을 치고 독산동 순댕이네 칼국수를 방문을 했어요.

위치는 독산동 남문시장 쪽에 있어요 독산역이나 구로디지털단지역에서 접근이 가능해요.

여기 자차는 비추에요 주차 공간이 거의 없어요.

가게 입구는 손님들이 많아서 찍기가 힘들었네요.

가격은 7,000원 곱배기는 8,000원이에요. 공깃밥은 무료인데 빨리 떨어져서 없는 걸로 생각하시면 될 거예요.

반찬은 단무지, 김치 2종류예요 여기 김치는 맛있는데 전 좀 매워서 아쉽네요 그래도 맛있어요.

이건 일반 칼제비예요. 청양고추 넣어서 얼큰하게 먹을 수도 있어요. 바지락 양이 많아서 손가락이 좀 아프실 거예요ㅎㅎ

얼큰 칼국수 곱빼기예요. 손가락이 2배는 더 아프네요 ㅎㅎ

한 70% 정도 바지락 껍데기이에요 오늘은 깨진 애들이 좀 있네요.

여기 평일은 30분? 그 정도면 먹을 수 있는데... 토요일 가시면 대시 1시간, 앉아서 30분? 그 정도는 생각하시고 가셔야 해요. 오전 10시 반이 오픈으로 알 고 있는데 오픈전에 오시면 그나마 빠르게 먹을 수 있을 거 같아요. 주중은 대기표가 없고 주말은 대기표가 있어요.

 

 

 

 

 

반응형
반응형

오늘은 회식 겸 점심에 자주 가는 갈빗집으로 갔어요. 낮에는 보통 쌈밥을 먹는데 돼지갈비도 있어서 저녁에도 방문하게 되었어요.

낮에 찍은 입구 사진인데 "돼지갈비" 엄청 강조하고 있네요 ㅎㅎ

왕갈비 330g에 14,000원이에요.

3인분을 시켰어요 한 덩어리에 1인분이에요.

각 덩어리마다 뼈들이 붙어있네요.

먹는 중에 계란말이를 시켰어요. 사진 찍으려고 준비 중인데 이미 2조각이 없어져 버렸네요 ㅎㅎ

후식 우렁된장인데 다먹을때쯤 바닥에 우렁들이 많다는 걸 알았어요.

이건 우렁초무침인데 새콤하고 맛이 괜찮았어요.

낮에 먹은 쌈밥정식인데 총 3인분이에요. 4명이면 쌈 2개 우렁된장 2개인데 3인분은 좀 애매하네요. 그래도 맛있어요 가끔 점심밥을 먹는데 먹는데 올 때마다 밥을 2 공기씩 먹네요~~ㅎㅎ

 

위치는 내방역 3,4번 근처에 있어요. 역에서 5분 정도 거리에 있어요.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

'먹거리' 카테고리의 다른 글

구로디지털단지 돌배기(차돌구이)  (2) 2021.03.21
독산 순댕이네 칼국수  (4) 2021.03.13
신대방 고기싸롱 무한리필  (6) 2021.03.06
내방역 횟집 제주어항  (4) 2021.02.25
이수 소갈비 인기명  (0) 2021.02.22

+ Recent posts