トピックに動的にサブスクライブする作業オブジェクトを作成することができます。 また、イベント・ソースへのアクセスを持つ任意のコンポーネントは、要求に応じてイベントを追加することができます。
class SampleWork implements Work { boolean released; Topic targetTopic; EventSource es; TopicConnectionFactory tcf; public SampleWork(TopicConnectionFactory tcf, EventSource es, Topic targetTopic) { released = false; this.targetTopic = targetTopic; this.es = es; this.tcf = tcf; } synchronized boolean getReleased() { return released; } public void run() { try { // setup our JMS stuff. TopicConnection tc = tcf.createConnection(); TopicSession sess = tc.createSession(false, Session.AUTOACK); tc.start(); MessageListener proxy = es.getEventTrigger(MessageListener.class, false); while(!getReleased()) { // block for up to 5 seconds. Message msg = sess.receiveMessage(5000); if(msg != null) { // fire an event when we get a message proxy.onMessage(msg); } } tc.close(); } catch (JMSException ex) { // handle the exception here throw ex; } finally { if (tc != null) { try { tc.close(); } catch (JMSExceptin ex1) { // handle exception } } } } // called when we want to stop the Work object. public synchronized void release() { released = true; } }
この結果、イベント・ソースへのアクセス権を持つコンポーネントは、 イベントをオンデマンドで追加することができます。これにより、コンポーネントは、 各クライアント・サブスクライバーに自身のスレッドを与えるよりもスケーラブルな方法でトピックをサブスクライブすることができます。 上記の例は WebSphere トレーダーのサンプルで詳細に説明されています。 詳しくは、サンプル・ギャラリーを参照してください。