Example: Work object

The following is an example of a work object that dynamically subscribes to a topic

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.


 

See Also


Accessing the Samples (Samples Gallery)

 

Related Tasks


Developing work objects to run code in parallel