2017-11-05 5 views
-1

상황을 잡는다 :대기 스레드는 이벤트

public void makeCall() { 
    Call call = CallFactory.createCall(); 
    CallListener listener = new CallListener(); 
    call.addListener(listener); 
    call.connect(); 
} 

:

@Transactional 
public void createCall() { 
    callManager.makeCall(); 
} 

하는의 그 콜 매니저는 다음과 같은 방법을 포함 가정 해 봅시다 : 나는 예를 들어 무효 방법, 를 실행 트랜잭션 방법을 가지고 connect() 메서드가 예외를 throw하지 않으면 makeCall() 메서드가 성공적으로 완료됩니다.

이제 리스너에서 우리는 예를 들어, 핸들러 방법이 있습니다

public void callTalking(AnyEvent event) { 
    //some logic 
} 

주요 질문은 : 우리의 거래 방법 createCall() 리스너까지callTalking에서 이벤트를 잡는다를 개최 할 수있는 아름다운 방법이() 시간 제한을 사용하지 않고?

편집 중요 정보는, 내가 (곧 말) gigaspace 폴링 이벤트를 사용하고 있음을 영원히 성공적인 거래 후 데이터베이스에서 오브젝트를합니다.

+0

로직이 스레드로 분할되어 표시되지 않으므로 기다릴 필요가 없습니다. 그러나 다른 쓰레드가 있다면 그들 사이에서 동기화를 사용할 수 있습니다 ('Object # wait()'와'Object # notify()') –

+0

가장 큰 문제는 다음 상황입니다. 응용 프로그램이 성공적으로 전화를 걸었지만 운영자가 전화를받지 않았고 응용 프로그램이 손상되고 통화가 끊어졌습니다. 그러나 트랜잭션이 성공으로 표시되어 롤백이 발생하지 않았습니다. –

답변

1

이것은 동기화를위한 예제 로직입니다. 스레드에서 실행되는 경우 영원히 차단됩니다. 이 예에서는 Call이 작동하는 스레드가 이벤트를 처리하지 않는 동안 주 스레드가 차단됩니다.

public void makeCall() { 
    Object semafor = new Object(); 
    synchronized (semafor) { 
     try { 
      CallListener listener = new CallListener() { 
       @Override 
       public void callTalking(AnyEvent event) { 
        // some logic 

        synchronized (semafor) { 
         semafor.notify(); 
        } 
       } 
      }; 

      Call call = CallFactory.createCall(); 
      call.addListener(listener); 
      call.connect(); 

      semafor.wait(); 
     } 
     catch (InterruptedException e) { 
      Thread.currentThread().interrupt(); 
      e.printStackTrace(); 
     } 
    } 
}