Now create the two services. Create a localconfig/test/services/ file that looks like this:


And create a localconfig/test/services/ file that looks like this:


The stockListeners property is recognized by Nucleus as indicating that the specified services act as listeners for the stock event. If your event source has multiple listeners, those listeners should be separated by commas. This means that the Bean should avoid creating a property called stockListeners.

Modify localconfig/ to specify the initial service:


Now restart the application. This creates the stockPricer object, then creates the stockWatcher to listen to the stock events. Because no one is actually sending any events, nothing should actually happen.

In the following example, stockWatcher starts a thread that waits for 4 seconds, then fires an event.

Note: This example is for demonstration purposes only, and should not be considered a general programming technique.

public class StockPricer implements Runnable {
  java.util.Vector listeners = new java.util.Vector ();

  public StockPricer () {
    new Thread (this).start ();
  public void run () {
    try { Thread.sleep (4000); }
    catch (InterruptedException exc) {}
    broadcastStockEvent (new StockEvent (this, "ATGC", 20.75));
  public synchronized void addStockListener (StockListener listener) {
    listeners.addElement (listener);
  public synchronized void removeStockListener (StockListener listener) {
    listeners.removeElement (listener);
  public synchronized StockListener [] getStockListeners () {
    StockListener [] ret = new StockListener [listeners.size ()];
    listeners.copyInto (ret);
    return ret;
  public void broadcastStockEvent (StockEvent ev) {
    for (int i = 0; i < listeners.size (); i++) {
      ((StockListener) listeners.elementAt (i)).stockPriceUpdated (ev);

Now reassemble your application. When you restart it, the StockPricer should wait 4 seconds, then fire an event to the StockWatcher, which prints the event out.