Methods Summary |
---|
public void | cancel(java.lang.String stock, StockNotify obj)Cancel request for stock updates for a particular stock.
Vector stocks = (Vector)notifyTable.get(obj);
stocks.removeElement(stock);
|
public synchronized void | cancelAll(StockNotify obj)Cancel all requests for stock updates for the remote object.
notifyTable.remove(obj);
|
private void | generateUpdates()Private method to generate random stock updates
Enumeration enum = stockTable.elements();
while (enum.hasMoreElements()) {
Stock stock = (Stock)enum.nextElement();
stock.update();
}
|
public Stock[] | list(StockNotify obj)Returns an array of stock update information for the stocks
already registered by the remote object.
Vector stocks = (Vector)notifyTable.get(obj);
Stock[] stockList = null;
if (stocks != null) {
Enumeration enum = stocks.elements();
stockList = new Stock[stocks.size()];
int i=0;
// collect updates to the stocks this watcher is
// interested in
while (enum.hasMoreElements()) {
String stockname = (String)enum.nextElement();
stockList[i++] = (Stock)stockTable.get(stockname);
}
}
return stockList;
|
public static void | main(java.lang.String[] args)Start up the stock server; also creates a registry so that the
StockApplet can lookup the server.
// Create and install the security manager
System.setSecurityManager(new RMISecurityManager());
try {
System.out.println("StockServer.main: creating registry");
LocateRegistry.createRegistry(2005);
System.out.println("StockServer.main: creating server");
StockServer server = new StockServer();
System.out.println("StockServer.main: binding server ");
Naming.rebind("//:2005/example.stock.StockServer", server);
System.out.println("StockServer.main: done");
// Note: this application will exit when all remote stock
// watchers drop their references to the remote server
// object and unregister their interest in watching stock
// reports.
} catch (Exception e) {
System.out.println("StockServer.main: an exception occurred: " +
e.getMessage());
e.printStackTrace();
}
|
public void | run()The run method (called from the notifier thread) sends out stock
updates periodically to those remote objects that have
registered interest in being notified.
boolean done = false;
do {
try {
// wait for a few seconds between updates
Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
}
Date date = new Date();
// update stocks in table
generateUpdates();
// enumerate through each watcher...
Enumeration enum = notifyTable.keys();
while (enum.hasMoreElements()) {
StockNotify obj = (StockNotify)enum.nextElement();
Stock[] stockList = list(obj);
if (stockList != null) {
// send update
try {
System.out.println("StockServer.run: sending update " +
date);
obj.update(date, stockList);
} catch (RemoteException e) {
// can't reach watcher; cancel notification request
System.out.println("StockServer.run: exception");
e.printStackTrace();
cancelAll(obj);
}
}
}
// check to see if the update thread should exit
synchronized (this) {
if (notifyTable.isEmpty()) {
notifier = null;
done = true;
}
}
} while (!done);
|
public synchronized Stock | watch(java.lang.String stock, StockNotify obj)Request notification of stock updates.
System.out.println("StockServer.watch: " + stock );
if (!stockTable.containsKey(stock)) {
throw new StockNotFoundException(stock);
}
Vector stocks = (Vector)notifyTable.get(obj);
// register interested party...
if (stocks == null) {
stocks = new Vector();
notifyTable.put(obj, stocks);
}
// add stock to list
if (!stocks.contains(stock)) {
stocks.addElement(stock);
}
// start thread to notify watchers...
if (notifier == null) {
notifier = new Thread(this, "StockNotifier");
notifier.start();
}
return (Stock)stockTable.get(stock);
|