01 package examples.webapp.pubsub.stock;
02
03 import java.io.IOException;
04 import java.util.ArrayList;
05 import java.util.List;
06 import java.util.Timer;
07 import java.util.TimerTask;
08
09 import org.json.JSONObject;
10
11 public abstract class AbstractPublisher {
12 private SymbolsProvider symbolsProvider = new SymbolsProvider();
13 private TradeSimulator tradeSimulator = new TradeSimulator();
14 private Stock[] stocks;
15 private Timer timer;
16
17 protected AbstractPublisher() {
18 initStockList();
19 }
20
21 private void initStockList() {
22 String[] symbols = getSymbolsProvider().getAllSymbols();
23 stocks = new Stock[symbols.length];
24 for (int i=0; i<symbols.length; i++) {
25 stocks[i] = new Stock(symbols[i]);
26 }
27 }
28
29 protected abstract Client getClient();
30
31 protected SymbolsProvider getSymbolsProvider() {
32 return this.symbolsProvider;
33 }
34
35 protected TradeSimulator getTradeSimulator() {
36 return this.tradeSimulator;
37 }
38
39 protected void printMessage(String message) {
40 System.out.println(message);
41 }
42
43 public void startup() {
44 final AbstractPublisher publisher = this;
45 timer = new Timer();
46 timer.scheduleAtFixedRate(new TimerTask() {
47 public void run() {
48 publisher.publish();
49 }}, 0, 2000);
50 }
51
52 public void halt() {
53 timer.cancel();
54 try {
55 getClient().close();
56 } catch (IOException e) {
57 printMessage(e.toString());
58 }
59 }
60
61 public void publish() {
62 List<String> channels = new ArrayList<String>();
63 List<JSONObject> data = new ArrayList<JSONObject>();
64 for (int i=0; i<stocks.length; i++) {
65 if (Math.random()<0.3) continue;
66 getTradeSimulator().simulateTrade(stocks[i]);
67 JSONObject publish = new JSONObject();
68 publish.put("stock", stocks[i].toJSONObject());
69 channels.add("/stock/" + stocks[i].getSymbol());
70 data.add(publish);
71 printMessage(stocks[i].getSymbol() + ", " + stocks[i].getFormatedPrice()
72 + ", " + stocks[i].getFormatedOpenPrice() + ", " + stocks[i].getQuantity());
73 }
74 try {
75 getClient().publish(channels.toArray(new String[channels.size()]), data.toArray(new JSONObject[data.size()]));
76 } catch (IOException e) {
77 printMessage(e.toString());
78 }
79 }
80 }
|