2017-11-05 1 views
-1

状況をキャッチするまで:私は、例えば、ボイド方法、 を実行するトランザクション方法、ありますホールドスレッドリスナーがイベントに

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

をさんは、CallManagerが、このようなメソッドが含まれているとしましょう:

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

connect()メソッドが例外をスローしない場合、makeCall()メソッドは正常に完了します。

さて、リスナーに我々は、たとえば、ハンドラメソッドを持っています。

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

主な問題は、私たちの取引方法createCall()リスナーまでcallTalkingでイベントをキャッチを保持する美しい方法があります()タイムアウトを使用しないでください?

EDIT 重要な情報は、私は(すぐに話す)gigaspaceポーリングイベントを、使用していることをは永遠に成功したトランザクションの後に、データベースからオブジェクトを受け取ります。

+0

ロジックがスレッドに分割されていないので、待機する必要はありません。しかし、異なるスレッドがある場合は、それらの間でsyncを使うことができます( 'Object#wait()'と 'Object#notify()') –

+0

主な問題は次の状況です。アプリケーションは通話を成功させましたが、オペレーターは通話していませんでした。同時にアプリケーションがクラッシュし、通話が失われました。しかし、トランザクションは成功としてマークされ、ロールバックはありませんでした。 –

答えて

1

これは、同期のロジック例です。スレッド上で実行されると、永遠にブロックされることに注意してください。この例では、メインスレッドはブロックされ、コールが動作するスレッドはイベントを処理しません。

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(); 
     } 
    } 
} 
関連する問題