2010-05-18 7 views
2

클라이언트의 일부 HTTP 요청에는 서버 측에 매우 복잡한 비즈니스 로직이 있습니다. 일부 비즈니스 로직은 누군가에게 전자 메일을 보내는 것처럼 클라이언트에 즉시 응답 할 필요가 없습니다. 이러한 작업을 비동기 방식으로 처리 할 수 ​​있으므로 해당 작업이 실행되었는지 확인하기 만하면됩니다. 사용자에게 응답하기 위해 완료된 모든 작업을 기다릴 필요가 없습니다.Java : 비동기 작업

업데이트 : 일부 사용자가 사용하고있는 프레임 워크에 대해 질문했습니다. Struts2 + Spring을 사용하고 있습니다.

답변

0

난 당신이 사용중인 프레임 워크 모르겠지만, 기본적인 자바에서, 당신은 단지 새로운 Thread 만들 수 있습니다

interface MyTaskCallback { 
    void myTaskCallback(); 
} 
class MyTask implements Runnable { 
    MyTaskCallback callback; 
    Thread me; 
    public MyTask(MyTaskCallback callback) { 
     this.callback = callback; 
     this.me = new Thread(); 
    } 

    public void start() { 
     this.me = new Thread(this); 
     this.me.start(); 
    } 

    public void stop() { 
     try { 
      this.me.join(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void run() { 
     // Calls here will not block the other threads 
     sendEmailRequest(); 
     callback.myTaskCallback(); 
    } 
} 

class Main implements MyTaskCallback { 
    public void foo() { 
     MyTask m = new MyTask(this); 
     m.start(); 
    } 

    public void myTaskCallback() { 
     // called when MyTask completes 
    } 
} 
0

예. concurrency에 대해 읽어보십시오.

예를 들어 비동기 생산자/소비자 대기열을 설정할 수 있습니다.

0

당신은 java.util.concurrent.Executors를보고 싶습니다. 문제를 해결하는 한 가지 방법은 Queue를 유지하고 모든 빈번히 실행되는 ScheduledExecutorService를 갖는 것입니다. 동시 유틸리티에서 작업 부하를 줄이는 방법에는 여러 가지가 있지만 요구 사항, 작업 비용, 실행 속도 등에 따라 다릅니다.

0

모든 HTTP 요청에 즉시 응답해야합니다. 그렇지 않으면 클라이언트가 서버가 응답하지 않거나 시간 초과되었다고 생각할 수 있습니다. 그러나 클라이언트에 응답하기 전에 백그라운드에서 다른 스레드 또는 프로세스를 시작하여 프로세스를 완료 할 수 있습니다.

작업이 완료 될 때까지 100 개의 응답을 계속 보낼 수도 있습니다.

0

예. Servlet 3.0에는 훌륭한 비동기식 지원이 있습니다.

Watch this 서블릿 3.0에 익숙하지 않은 사용자라면 전체 캐스트를 볼 수 있습니다.

좋은 실행 결과 here.

api docs.

-1

이러한 작업을 비동기 방식으로 수행 할 수 있으므로 사용자에게 응답하기 위해 완료된 모든 작업을 기다릴 필요가 없습니다.

new Thread(new Runnable(){ 
    public void run(){ 
     System.out.println("I Am Sending Email"); 
     sendEmailFunction(); 
    } 
}).start(); 

그러나 너무 많은 같은 스레드 문제로 이어질 것입니다 :

은 YES

2

당신은 패턴 다음 '화재 잊어'사용할 수 있습니다. 이 작업을 수행하려는 경우 ThreadPoolExecutor를 사용하여 스레드 생성을 일부 제어 할 수 있도록해야합니다. 최소한 스레드 수를 최대로 설정하십시오.

0

Spring은 Quartz 스케쥴링과 Java Threading을 잘 지원한다. 이 link은 당신에게 더 좋은 아이디어를 줄 것입니다.