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);
if (notifyTable.isEmpty()) {
Thread thread = notifier; // in case current thread is notifier
notifier = null;
thread.stop();
}
|
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");
} 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.
while (true) {
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);
}
}
}
}
|
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 intereted 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);
|