メソッドが始動されるインターフェースのプロキシーを作成する listenerCountChanged イベントを始動する ことができます。プロキシー上でイベントに対応するメソッドを呼び出すと、 EventSourceEvents インターフェースが実装されます。同じプロキシーを使用すると、同時に複数のイベントを送信できます。
以下のコード例では、listenerCountChanged イベントの発行方法を示します。
// imagine this snippet inside an EJB or servlet method. // Make an inner class implementing the required event interfaces. EventSourceEvents listener = new Object() implements EventSourceEvents.class { void listenerCountChanged(EventSource es, int old, int newCount) { try { InitialContext ic = new InitialContext(); // Here, the asynchronous bean can access an environment variable of // the component which created it. int i = (Integer)ic.lookup("java:comp/env/countValue").intValue()); if(newCount == i) { // do something interesting } // call this event when the following code executes: } catch(NamingException e) { } } void listenerExceptionThrown( EventSource es, Object listener, String methodName, Throwable exception) { } void unexpectedException(EventSource es, Object runnable, Throwable exception) { } } // register it. es.addListener(listener); ... // now fire an event which the previous listener receives. EventSourceEvents proxy = (EventSourceEvents) es.getEventTrigger(EventSourceEvents.class, false); proxy.listenerCountChanged(es, 0, 1); // now, fire another event, you can call any of the methods. proxy.listenerCountChanged(es, 4, 5);
この例の出力は、メソッドが実行されるインターフェースのプロキシーです。その後、プロキシー上でイベントに対応するメソッドを呼び出します。 このアクションにより、EventSourceEvents インターフェースがインプリメントされており、事前に EventSource "es" に登録されているすべてのイベント・リスナー上で、同じメソッドが同じパラメーターを使用して呼び出されます。 同じプロキシーを使用すると、同時に複数のイベントを送信できます。
getEventTrigger() メソッドの ブール・パラメーターは、sameTransaction です。sameTransaction パラメーターが false の場合は、起動済みイベント・リスナーごとに新規トランザクションが開始され、これらのイベント・リスナーは、呼び出し元と並列に呼び出されます。 ただし、この event() メソッドは、すべてのイベント・リスナーが通知されるまでブロックされます。 sameTransaction パラメーターが true の場合は、スレッドに現行のトランザクションがある場合はそのトランザクションがすべてのイベント・リスナーに使用されます。 イベント・リスナーは、イベントを発生させたメソッドのトランザクションを共用します。 このため、すべてのイベント・リスナーは、未決定の順序で直列に実行される必要があります。 リスナーが呼び出される順序は未定義であり、リスナーが登録される順序は、実行時に使用される順序の指針とはなりません。 プロキシー上のメソッドは、すべてのイベント・リスナーが呼び出されるまで戻りません。つまり、このアクションは同期操作です。
参照およびリスナーが渡すパラメーターは、そうするようにメソッドを構成していない限り、これらの参照の機能を妨害することはありません。例えば、イベント・リスナーをコラボレーターとして使用すると、データを (パラメーターだった) マップに追加できます。 各イベント・リスナーは、独自のトランザクションで実行され、スレッド上でアクティブなトランザクションとは 関係なく実行されます。 パラメーターは複数のスレッドからアクセスされる可能性があるため、sameTransaction パラメーターが false の場合は細心の注意を払う必要があります。