2017-02-01 12 views
0


API를 개발 중입니다. 이 API는 결과를 얻기 위해 2 개의 DB 쿼리를 수행해야합니다. 컨트롤러에 반환 형식으로 호출 사용
스프링 4에서 병렬 스레드를 실행하는 우아한 방법

  • :
    나는 다음과 같은 전략을 시도했다.
  • 2 개의 쿼리를 병렬로 실행하고 완료 시간을 감지하기 위해 Callable 및 CoundownLatch를 사용하는 2 개의 스레드가 생성되었습니다.


public class PetService { 
    public Object getData() { 
     CountDownLatch latch = new CountDownLatch(2); 
     AsyncQueryDBTask<Integer> firstQuery= new AsyncQueryDBTask<>(latch); 
     AsyncQueryDBTask<Integer> secondQuery= new AsyncQueryDBTask<>(latch); 
     latch.await(); 
} 

public class AsyncQueryDBTask<T> implements Callable { 

    private CountDownLatch latch; 

    public AsyncQueryDBTask(CountDownLatch latch) { this.latch = latch;} 

    @Override 
    public T call() throws Exception { 
    //Run query 
    latch.countDown(); 
    } 
그것은 잘 작동하지만 난 어디 선가 봄의 구조를 파괴하고 생각합니다.

스프링 4에서 데이터를 가져 오는 가장 효율적인 방법이 궁금합니다.
- 자신의 쿼리를 실행하는 2 개의 스레드가 모두 작업을 완료하는 방법을 알고 싶습니까?
- 사용 및 릴리스 스레드와 같은 스레드 리소스를 제어하는 ​​방법은 무엇입니까?

미리 감사드립니다.

+1

https://www.mkyong.com/spring/spring-and-java-thread-example/ – StanislavL

답변

4

일반적으로 ApplicationServer에 자체 스레드를 생성하거나 스레드 수명주기를 관리하지 않으려합니다. 응용 프로그램 서버에서는 ExecutorService에 작업을 제출하여 백그라운드 작업자 스레드를 풀링 할 수 있습니다.

편리하게도 Spring에는 모든 것을 처리하는 @Async 주석이 있습니다. 당신이 ThreadPoolTaskExecutor을 구성하고 봄 당신을 위해 작업을 제출 처리합니다, 비동기 방식을 가능하게있는 한

public class PetService { 
    public Object getData() { 
     Future<Integer> futureFirstResult = runFirstQuery(); 
     Future<Integer> futureSecondResult = runSecondQuery(); 

     Integer firstResult = futureFirstResult.get(); 
     Integer secondResult = futureSecondResult.get(); 
    } 

    @Async 
    public Future<Integer> runFirstQuery() { 
     //do query 
     return new AsyncResult<>(result); 
    } 

    @Async 
    public Future<Integer> runSecondQuery() { 
     //do query 
     return new AsyncResult<>(result); 
    } 
} 

: 당신의 예에서, 당신은 미래를 반환 2 개 비동기 방법을 만들 것입니다.

참고 : get() 메서드는 결과가 작업자 스레드에 의해 반환 될 때까지 현재 스레드를 차단하지만 다른 작업자 스레드는 차단하지 않습니다. 일반적으로 차단을 막기 위해 시간 제한을 설정하는 것이 좋습니다.

+0

답변 해 주셔서 감사합니다. 정말 도움이됩니다. 한번 더 질문 해주세요. 그것을 할 것이니 괜찮습니까 : '''java List l = new ArrayList(); l.add (future1.get()); l.add (future2.get()); ''' – duy

+0

네, 괜찮습니다. get 호출은 앞으로 값을 항상 반환합니다 (또는 제한 시간 버전을 사용하는 경우 예외가 발생 함) –

+0

대단히 감사합니다. – duy