You can create a work object that dynamically subscribes to a topic and any component that has access to the event source can add an event on demand.
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; } }
As a result, any component that has access to the event source can add an event on demand, which allows components to subscribe to a topic in a more scalable way than by simply giving each client subscriber its own thread. The previous example is fully explored in the WebSphere Trader Sample. See the Samples Gallery for details.