From 9c95b62c3c640ec3bed2f4e929af863de54a4e78 Mon Sep 17 00:00:00 2001
From: fhanik
Date: Tue, 21 Oct 2008 18:07:04 +0000
Subject: [PATCH] work on the bayeux samples
git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@706696 13f79535-47bb-0310-9956-ffa450edef68
---
java/org/apache/tomcat/bayeux/BayeuxServlet.java | 2 +-
java/org/apache/tomcat/bayeux/ClientImpl.java | 3 +-
java/org/apache/tomcat/bayeux/RequestBase.java | 2 +-
.../cometd/bayeux/samples/BayeuxStockTicker.java | 215 +++++++++++++++++++++
.../cometd/bayeux/samples/EchoChatClient.java | 16 +-
webapps/cometd/WEB-INF/web.xml | 11 ++
webapps/cometd/examples/simplechat/ticker.html | 129 +++++++++++++
webapps/cometd/index.html | 1 +
8 files changed, 363 insertions(+), 16 deletions(-)
create mode 100644 test/org/apache/cometd/bayeux/samples/BayeuxStockTicker.java
create mode 100644 webapps/cometd/examples/simplechat/ticker.html
diff --git a/java/org/apache/tomcat/bayeux/BayeuxServlet.java b/java/org/apache/tomcat/bayeux/BayeuxServlet.java
index c230336cc..837086d70 100644
--- a/java/org/apache/tomcat/bayeux/BayeuxServlet.java
+++ b/java/org/apache/tomcat/bayeux/BayeuxServlet.java
@@ -92,7 +92,7 @@ public class BayeuxServlet implements CometProcessor {
protected int getReconnectInterval() {
String rs = servletConfig.getInitParameter("reconnectInterval");
- int rct = 5000; //5 seconds
+ int rct = 1000; //1 seconds
try {
rct = Integer.parseInt(rs);
}catch (NumberFormatException nfe) {
diff --git a/java/org/apache/tomcat/bayeux/ClientImpl.java b/java/org/apache/tomcat/bayeux/ClientImpl.java
index f1ab929be..894f9efb0 100644
--- a/java/org/apache/tomcat/bayeux/ClientImpl.java
+++ b/java/org/apache/tomcat/bayeux/ClientImpl.java
@@ -115,9 +115,10 @@ public class ClientImpl implements Client {
//local clients must have a listener
ArrayList list = new ArrayList();
for (int i=0; msgs!=null && i0) {
getListener().deliver(list.toArray(new Message[0]));
}
} else {
diff --git a/java/org/apache/tomcat/bayeux/RequestBase.java b/java/org/apache/tomcat/bayeux/RequestBase.java
index 6e1fc6a4a..e3c4000c8 100644
--- a/java/org/apache/tomcat/bayeux/RequestBase.java
+++ b/java/org/apache/tomcat/bayeux/RequestBase.java
@@ -76,7 +76,7 @@ public abstract class RequestBase implements BayeuxRequest {
protected static Log log = LogFactory.getLog(RequestBase.class);
- protected int reconnectInterval;
+ protected int reconnectInterval = 1000;
protected RequestBase(TomcatBayeux tb, CometEvent event, JSONObject jsReq) throws JSONException {
this.tomcatBayeux = tb;
diff --git a/test/org/apache/cometd/bayeux/samples/BayeuxStockTicker.java b/test/org/apache/cometd/bayeux/samples/BayeuxStockTicker.java
new file mode 100644
index 000000000..5f61d293b
--- /dev/null
+++ b/test/org/apache/cometd/bayeux/samples/BayeuxStockTicker.java
@@ -0,0 +1,215 @@
+package org.apache.cometd.bayeux.samples;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.ServletContextAttributeListener;
+import javax.servlet.ServletContextAttributeEvent;
+import org.apache.cometd.bayeux.Bayeux;
+
+import java.text.DecimalFormat;
+import java.util.List;
+import java.util.Random;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.cometd.bayeux.Client;
+import org.apache.cometd.bayeux.Listener;
+import org.apache.cometd.bayeux.Message;
+import org.apache.cometd.bayeux.Channel;
+
+public class BayeuxStockTicker implements ServletContextListener,
+ ServletContextAttributeListener, Listener {
+
+ static AtomicInteger counter = new AtomicInteger(0);
+ protected int id;
+ protected Bayeux b;
+ protected Client c;
+ protected boolean alive = true;
+ protected boolean initialized = false;
+ protected TickerThread tt = new TickerThread();
+
+ public BayeuxStockTicker() {
+ id = counter.incrementAndGet();
+ System.out.println("new listener created with id:" + id);
+ }
+
+ public void contextDestroyed(ServletContextEvent servletContextEvent) {
+ alive = false;
+ tt.run = false;
+ tt.interrupt();
+ }
+
+ public void contextInitialized(ServletContextEvent servletContextEvent) {
+ }
+
+ public void attributeAdded(ServletContextAttributeEvent scae) {
+ if (scae.getName().equals(Bayeux.DOJOX_COMETD_BAYEUX)) {
+ if (initialized) return;
+ initialized = true;
+ System.out.println("Starting stock ticker server client!");
+ b = (Bayeux) scae.getValue();
+ c = b.newClient("stock-ticker-", this);
+ tt.start();
+ }
+ }
+
+ public void attributeRemoved(ServletContextAttributeEvent scae) {
+ if (scae.getName().equals(Bayeux.DOJOX_COMETD_BAYEUX)) {
+ initialized = false;
+ b = (Bayeux) scae.getValue();
+ List chs = b.getChannels();
+ for (Channel ch : chs) {
+ ch.unsubscribe(c);
+ }
+ }
+ }
+
+ public void attributeReplaced(
+ ServletContextAttributeEvent servletContextAttributeEvent) {
+ }
+
+ public void removed(boolean timeout) {
+ System.out.println("Client removed.");
+ }
+
+ public void deliver(Message[] msgs) {
+ for (int i = 0; msgs != null && i < msgs.length; i++) {
+ Message msg = msgs[i];
+ System.out.println("[stock ticker server client ]received message:" + msg);
+ }
+ }
+
+ public class TickerThread extends Thread {
+ public boolean run = true;
+
+ public TickerThread() {
+ setName("Ticker Thread");
+ }
+
+ public void run() {
+ try {
+
+ Stock[] stocks = new Stock[] {
+ new Stock("GOOG", 435.43),
+ new Stock("YHOO", 27.88),
+ new Stock("SPRG", 1015.55), };
+ for (Stock s : stocks) {
+ Channel ch = b.getChannel("/stock/"+s.getSymbol(), true);
+ ch.subscribe(c);
+
+ }
+ Random r = new Random(System.currentTimeMillis());
+ while (run) {
+ for (int j = 0; j < 1; j++) {
+ int i = r.nextInt() % 3;
+ if (i < 0)
+ i = i * (-1);
+ Stock stock = stocks[i];
+ double change = r.nextDouble();
+ boolean plus = r.nextBoolean();
+ if (plus) {
+ stock.setValue(stock.getValue() + change);
+ } else {
+ stock.setValue(stock.getValue() - change);
+ }
+ Channel ch = b.getChannel("/stock/"+stock.getSymbol(), true);
+ Message m = b.newMessage(c);
+ m.put("stock", stock.toString());
+ m.put("symbol", stock.getSymbol());
+ m.put("price", stock.getValueAsString());
+ m.put("change", stock.getLastChangeAsString());
+ ch.publish(m);
+ System.out.println("Stock: "+stock.getSymbol()+" Price: "+stock.getValueAsString()+" Change: "+stock.getLastChangeAsString());
+ }
+ Thread.sleep(850);
+ }
+ } catch (InterruptedException ix) {
+
+ } catch (Exception x) {
+ x.printStackTrace();
+ }
+ }
+ }
+
+ public static class Stock {
+ protected static DecimalFormat df = new DecimalFormat("0.00");
+ protected String symbol = "";
+ protected double value = 0.0d;
+ protected double lastchange = 0.0d;
+ protected int cnt = 0;
+
+ public Stock(String symbol, double initvalue) {
+ this.symbol = symbol;
+ this.value = initvalue;
+ }
+
+ public void setCnt(int c) {
+ this.cnt = c;
+ }
+
+ public int getCnt() {
+ return cnt;
+ }
+
+ public String getSymbol() {
+ return symbol;
+ }
+
+ public double getValue() {
+ return value;
+ }
+
+ public void setValue(double value) {
+ double old = this.value;
+ this.value = value;
+ this.lastchange = value - old;
+ }
+
+ public String getValueAsString() {
+ return df.format(value);
+ }
+
+ public double getLastChange() {
+ return this.lastchange;
+ }
+
+ public void setLastChange(double lastchange) {
+ this.lastchange = lastchange;
+ }
+
+ public String getLastChangeAsString() {
+ return df.format(lastchange);
+ }
+
+ public int hashCode() {
+ return symbol.hashCode();
+ }
+
+ public boolean equals(Object other) {
+ if (other instanceof Stock) {
+ return this.symbol.equals(((Stock) other).symbol);
+ } else {
+ return false;
+ }
+ }
+
+ public String toString(){
+ StringBuffer buf = new StringBuffer("STOCK#");
+ buf.append(getSymbol());
+ buf.append("#");
+ buf.append(getValueAsString());
+ buf.append("#");
+ buf.append(getLastChangeAsString());
+ buf.append("#");
+ buf.append(String.valueOf(getCnt()));
+ return buf.toString();
+
+ }
+
+ public Object clone() {
+ Stock s = new Stock(this.getSymbol(), this.getValue());
+ s.setLastChange(this.getLastChange());
+ s.setCnt(this.cnt);
+ return s;
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/test/org/apache/cometd/bayeux/samples/EchoChatClient.java b/test/org/apache/cometd/bayeux/samples/EchoChatClient.java
index 3d7c393f1..6f6ca8e17 100644
--- a/test/org/apache/cometd/bayeux/samples/EchoChatClient.java
+++ b/test/org/apache/cometd/bayeux/samples/EchoChatClient.java
@@ -19,33 +19,23 @@ public class EchoChatClient implements ServletContextListener, ServletContextAtt
protected Client c;
protected boolean alive = true;
protected TimestampThread tt = new TimestampThread();
+
public EchoChatClient() {
id = counter.incrementAndGet();
System.out.println("new listener created with id:"+id);
}
- /**
- * contextDestroyed
- *
- * @param servletContextEvent ServletContextEvent
- * @todo Implement this javax.servlet.ServletContextListener method
- */
public void contextDestroyed(ServletContextEvent servletContextEvent) {
alive = false;
tt.interrupt();
}
- /**
- * contextInitialized
- *
- * @param servletContextEvent ServletContextEvent
- * @todo Implement this javax.servlet.ServletContextListener method
- */
public void contextInitialized(ServletContextEvent servletContextEvent) {
}
public void attributeAdded(ServletContextAttributeEvent scae) {
if (scae.getName().equals(Bayeux.DOJOX_COMETD_BAYEUX)) {
+ System.out.println("Starting echo chat client!");
b = (Bayeux)scae.getValue();
c = b.newClient("echochat-",this);
Channel ch = b.getChannel("/chat/demo",true);
@@ -101,7 +91,7 @@ public class EchoChatClient implements ServletContextListener, ServletContextAtt
m.put("join",false);
ch.publish(m);
}catch (InterruptedException ignore) {
-
+ Thread.currentThread().interrupted();
}catch (Exception x) {
x.printStackTrace();
}
diff --git a/webapps/cometd/WEB-INF/web.xml b/webapps/cometd/WEB-INF/web.xml
index 085353b30..e8d2f8042 100644
--- a/webapps/cometd/WEB-INF/web.xml
+++ b/webapps/cometd/WEB-INF/web.xml
@@ -13,6 +13,10 @@
timeout
120000000
+
+ reconnectInterval
+ 250
+
1
@@ -21,6 +25,13 @@
/cometd/*
+
+ org.apache.cometd.bayeux.samples.EchoChatClient
+
+
+ org.apache.cometd.bayeux.samples.BayeuxStockTicker
+
+
diff --git a/webapps/cometd/examples/simplechat/ticker.html b/webapps/cometd/examples/simplechat/ticker.html
new file mode 100644
index 000000000..235b6e48d
--- /dev/null
+++ b/webapps/cometd/examples/simplechat/ticker.html
@@ -0,0 +1,129 @@
+
+
+
+
+Bayeux Stock Ticker
+
+
+
+
+
+
+Bayeux Stock Ticker
+
+
+
+
+
+
\ No newline at end of file
diff --git a/webapps/cometd/index.html b/webapps/cometd/index.html
index 86f29cdfa..9a7d6d752 100644
--- a/webapps/cometd/index.html
+++ b/webapps/cometd/index.html
@@ -3,4 +3,5 @@
Try the Simple Chat Demo.
+Try the Stock Ticker Demo.
--
2.11.0