A work object implements
the com.ibm.websphere.asynchbeans.Work interface. For example, 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. Refer
to the Samples section of the Information Center for details.