티스토리 뷰

 

 Callback 

 

Success

interface SuccessCallback {
  void onSuccess(String result);
}

 

Exception

interface ExceptionCallback {
    void onError(Throwable throwable);
}

 

 FutureTask 

public static class CallbackFutureTask extends FutureTask<String> {
    SuccessCallback successCallback;
    ExceptionCallback exceptionCallback;
    public CallbackFutureTask(Callable<String> callable, SuccessCallback successCallback, ExceptionCallback ec) {
      super(callable);
      this.successCallback = Objects.requireNonNull(successCallback);
      this.exceptionCallback = Objects.requireNonNull(ec);
    }

    @Override
    protected void done() {
      try {
        successCallback.onSuccess(get());
      } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
      } catch (ExecutionException e) {
        exceptionCallback.onError(e);
      }
    }
  }

 

 Success 

public static void main(String[] args) {
    // Thread Pool 생성
    ExecutorService es = Executors.newCachedThreadPool();

    CallbackFutureTask callbackFutureTask = new CallbackFutureTask(() -> {
      Thread.sleep(2000);
      log.info("Async");
      return "Hello";
}, System.out::println, e -> log.error("Error(에러): " + e.getMessage()));

    es.execute(callbackFutureTask);
    es.shutdown();
  }

 

 

결과

08:33:21.597 [pool-1-thread-1] INFO asynchronous.toby.FutureEx - Async
Hello

 

 

 Exception 

public static void main(String[] args) {
    // Thread Pool 생성
    ExecutorService es = Executors.newCachedThreadPool();

    CallbackFutureTask callbackFutureTask = new CallbackFutureTask(() -> {
            // 비즈니스 로직
      Thread.sleep(2000);
      log.info("Async");
      return "Hello";
        }, System.out::println
         , e -> log.error("Error(에러): " + e.getMessage()));

    es.execute(callbackFutureTask);
    es.shutdown();
  }

 

 

결과

08:45:51.082 [pool-1-thread-1] ERROR asynchronous.toby.FutureEx - Error(에러): java.lang.RuntimeException: 알 수 없는 예외 발생

 

문제점

  • 비즈니스 로직과 비동기 처리를 위한 로직이 책임을 나누지 못하고 섞여있다.
    • 이는 마치 JDBC 에서 try-catch 를 포함한 공통 작업과 변화하는 질의가 섞여있는 것과 같다.

 

참조

'BackEnd > Java&Kotilin' 카테고리의 다른 글

[Java] Java NIO 의 등장배경  (0) 2022.10.06
[Java] Java I/O  (0) 2022.10.01
ExecutorService 와 Future  (0) 2022.09.17
캡슐화와 정보은닉  (0) 2022.08.28
[Spring Cloud] API Gateway에 Filter 추가하기  (1) 2022.08.27
댓글