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

+

 

+

+ + + + + + + + + + + + + + + + + + + + + + + + +
SYMBOLPRICELAST CHANGESUBSCRIBE
SPRG
GOOG
YHOO
+

+ + \ 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