PriceServerImpl.java
上传用户:dinglihq
上传日期:2013-02-04
资源大小:99958k
文件大小:5k
源码类别:

Java编程

开发平台:

Java

  1. package bible.rmi.example3;
  2. import java.util.*;
  3. import javax.naming.*;
  4. import weblogic.rmi.*;
  5. /**
  6.  * PriceServerImpl implements the PriceServer remote interface, providing
  7.  * prices on securities for remote clients.
  8.  */
  9. public class PriceServerImpl implements PriceServer {
  10.   // Stock price database, implemented as a Hashtable.
  11.   /** stockTable           */
  12.   private Hashtable stockTable = null;
  13.   // Hostname of the box where the server is running.
  14.   /** hostname           */
  15.   private String hostname = null;
  16.   /**
  17.    * Creates the stock price 'database'.
  18.    */
  19.   public PriceServerImpl() {
  20.     stockTable = new Hashtable();
  21.     Float f = new Float(0);
  22.     stockTable.put("SUNW", f.valueOf("20"));
  23.     stockTable.put("INTC", f.valueOf("30"));
  24.     stockTable.put("BEAS", f.valueOf("40"));
  25.   }
  26.   /**
  27.    * Returns the price of the given security.
  28.    * @param symbol
  29.    */
  30.   public float getPrice(String symbol) throws java.rmi.RemoteException {
  31.     Float f = (Float) stockTable.get(symbol);
  32.     System.out.println("PriceServer: Call to getPrice for symbol : "
  33.                        + symbol);
  34.     return f.floatValue();
  35.   }
  36.   /**
  37.    * Sets the price for the given security.
  38.    * @param symbol
  39.    * @param price
  40.    */
  41.   public void setPrice(String symbol, float price) throws java.rmi.RemoteException{
  42.     Float f = new Float(price);
  43.     stockTable.put(symbol, f);
  44.     System.out.println("PriceServer: Call to setPrice for " + symbol + " to "
  45.                        + price);
  46.   }
  47.   /**
  48.    * Returns all ticker symbols in this server's database.
  49.    */
  50.   public String[] getSecurities() throws java.rmi.RemoteException{
  51.     if (stockTable.size() > 0) {
  52.       String[]    securities = new String [stockTable.size()];
  53.       Enumeration enum       = stockTable.keys();
  54.       int         i          = 0;
  55.       while (enum.hasMoreElements()) {
  56.         securities [i] = (String) enum.nextElement();
  57.         i++;
  58.       }
  59.       return securities;
  60.     }
  61.     return null;
  62.   }
  63.   /**
  64.    * Submits an order for the client, then asynchronously
  65.    * notifies that client when the order gets executed.
  66.    * @param order Order to be submitted by the client.
  67.    * @param clientRef Remote reference for the client, used for asynchronous execution notification.
  68.    */
  69.   public void enterMarketOrder(Order order, ExecutionAlert clientRef) throws java.rmi.RemoteException{
  70.     // Multi-threaded this so it returns to the client right away and
  71.     // does its execution/callback work later.
  72.     System.out.println("A client has placed an order!");
  73.     System.out.println("Time: " + new Date());
  74.     System.out.println(order + "n");
  75.     DoExecution exec = new DoExecution(order, clientRef);
  76.     new Thread(exec).start();
  77.   }
  78.   /**
  79.    * Inner-class providing asynchronous client callbacks of order activity.
  80.    */
  81.   private class DoExecution implements Runnable {
  82.     /** order           */
  83.     private Order order;
  84.     /** client           */
  85.     private ExecutionAlert client;
  86.     /**
  87.      * @param ord
  88.      * @param clientRef
  89.      */
  90.     public DoExecution(Order ord, ExecutionAlert clientRef) {
  91.       order  = ord;
  92.       client = clientRef;
  93.     }
  94.     /**
  95.      * run
  96.      */
  97.     public void run() {
  98.       try {
  99.         // Wait 10 seconds to simulate submission of the order
  100.         // to a stock exchange.
  101.         Thread.currentThread().sleep(10000);
  102.         // Create an Execution instance and execute the order.
  103.         Execution execution = new Execution();
  104.         // Copy order data into the execution.
  105.         execution.setNumber(order.getNumber());
  106.         execution.setSymbol(order.getSymbol());
  107.         execution.setShares(order.getShares());
  108.         // Execute at the stock's current price and write a status
  109.         // message to standard output.
  110.         execution.setPrice(getPrice(order.getSymbol()));
  111.         System.out.println("An order has been executed!");
  112.         System.out.println("Time: " + new Date());
  113.         System.out.println(execution + "n");
  114.         // Make a remote call to the client to notify them
  115.         // of the execution.
  116.         client.notifyOfExecution(execution);
  117.       } catch (Exception e) {
  118.         e.printStackTrace();
  119.       }
  120.     }
  121.   }
  122.   /**
  123.    * Instanciates and binds a PriceServer.
  124.    * @param args
  125.    */
  126.   public static void main(String[] args) {
  127.     try {
  128.       PriceServerImpl server = new PriceServerImpl();
  129.       Context         ctx    = new InitialContext();
  130.       ctx.bind(PRICESERVERNAME, server);
  131.       System.out.println("PriceServer was started and bound in the registry "
  132.                          + "to the name " + PRICESERVERNAME);
  133.     } catch (Exception e) {
  134.       e.printStackTrace();
  135.       System.exit(1);
  136.     }
  137.   }
  138. }