Author: fhanik
Date: Tue Oct 21 11:07:04 2008
New Revision: 706696
URL: http://svn.apache.org/viewvc?rev=706696&view=rev
Log:
work on the bayeux samples
Added:
tomcat/trunk/test/org/apache/cometd/bayeux/samples/BayeuxStockTicker.java
tomcat/trunk/webapps/cometd/examples/simplechat/ticker.html
Modified:
tomcat/trunk/java/org/apache/tomcat/bayeux/BayeuxServlet.java
tomcat/trunk/java/org/apache/tomcat/bayeux/ClientImpl.java
tomcat/trunk/java/org/apache/tomcat/bayeux/RequestBase.java
tomcat/trunk/test/org/apache/cometd/bayeux/samples/EchoChatClient.java
tomcat/trunk/webapps/cometd/WEB-INF/web.xml
tomcat/trunk/webapps/cometd/index.html
Modified: tomcat/trunk/java/org/apache/tomcat/bayeux/BayeuxServlet.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/bayeux/BayeuxServlet.java?rev=706696&r1=706695&r2=706696&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/bayeux/BayeuxServlet.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/bayeux/BayeuxServlet.java Tue Oct 21
11:07:04 2008
@@ -92,7 +92,7 @@
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) {
Modified: tomcat/trunk/java/org/apache/tomcat/bayeux/ClientImpl.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/bayeux/ClientImpl.java?rev=706696&r1=706695&r2=706696&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/bayeux/ClientImpl.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/bayeux/ClientImpl.java Tue Oct 21
11:07:04 2008
@@ -115,9 +115,10 @@
//local clients must have a listener
ArrayList<Message> list = new ArrayList<Message>();
for (int i=0; msgs!=null && i<msgs.length; i++) {
+ //dont deliver to ourselves
if (this!=msgs[i].getClient()) list.add(msgs[i]);
}
- if (getListener() != null) {
+ if (getListener() != null && list.size()>0) {
getListener().deliver(list.toArray(new Message[0]));
}
} else {
Modified: tomcat/trunk/java/org/apache/tomcat/bayeux/RequestBase.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/bayeux/RequestBase.java?rev=706696&r1=706695&r2=706696&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/bayeux/RequestBase.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/bayeux/RequestBase.java Tue Oct 21
11:07:04 2008
@@ -76,7 +76,7 @@
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;
Added: tomcat/trunk/test/org/apache/cometd/bayeux/samples/BayeuxStockTicker.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/cometd/bayeux/samples/BayeuxStockTicker.java?rev=706696&view=auto
==============================================================================
--- tomcat/trunk/test/org/apache/cometd/bayeux/samples/BayeuxStockTicker.java
(added)
+++ tomcat/trunk/test/org/apache/cometd/bayeux/samples/BayeuxStockTicker.java
Tue Oct 21 11:07:04 2008
@@ -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<Channel> 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
Modified: tomcat/trunk/test/org/apache/cometd/bayeux/samples/EchoChatClient.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/cometd/bayeux/samples/EchoChatClient.java?rev=706696&r1=706695&r2=706696&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/cometd/bayeux/samples/EchoChatClient.java
(original)
+++ tomcat/trunk/test/org/apache/cometd/bayeux/samples/EchoChatClient.java Tue
Oct 21 11:07:04 2008
@@ -19,33 +19,23 @@
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 @@
m.put("join",false);
ch.publish(m);
}catch (InterruptedException ignore) {
-
+ Thread.currentThread().interrupted();
}catch (Exception x) {
x.printStackTrace();
}
Modified: tomcat/trunk/webapps/cometd/WEB-INF/web.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/cometd/WEB-INF/web.xml?rev=706696&r1=706695&r2=706696&view=diff
==============================================================================
--- tomcat/trunk/webapps/cometd/WEB-INF/web.xml (original)
+++ tomcat/trunk/webapps/cometd/WEB-INF/web.xml Tue Oct 21 11:07:04 2008
@@ -13,6 +13,10 @@
<param-name>timeout</param-name>
<param-value>120000000</param-value>
</init-param>
+ <init-param>
+ <param-name>reconnectInterval</param-name>
+ <param-value>250</param-value>
+ </init-param>
<load-on-startup>1</load-on-startup>
</servlet>
@@ -21,6 +25,13 @@
<url-pattern>/cometd/*</url-pattern>
</servlet-mapping>
+ <listener>
+
<listener-class>org.apache.cometd.bayeux.samples.EchoChatClient</listener-class>
+ </listener>
+ <listener>
+
<listener-class>org.apache.cometd.bayeux.samples.BayeuxStockTicker</listener-class>
+ </listener>
+
</web-app>
Added: tomcat/trunk/webapps/cometd/examples/simplechat/ticker.html
URL:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/cometd/examples/simplechat/ticker.html?rev=706696&view=auto
==============================================================================
--- tomcat/trunk/webapps/cometd/examples/simplechat/ticker.html (added)
+++ tomcat/trunk/webapps/cometd/examples/simplechat/ticker.html Tue Oct 21
11:07:04 2008
@@ -0,0 +1,129 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1" >
+<title>Bayeux Stock Ticker</title>
+<script type="text/javascript"
src="../../dojo/dojo.js.uncompressed.js"></script>
+<script type="text/javascript" src="../../dojox/cometd.js"></script>
+<script type="text/javascript" src="../../dojox/cometd/_base.js"></script>
+<script type="text/javascript">
+
+dojo.require("dojox.cometd");
+
+dojo.addOnUnload(function() {
+ dojox.cometd.init("/cometd/cometd");
+ dojox.cometd.startBatch();
+ dojox.cometd.unsubscribe("/stock/GOOG", this,"");
+ dojox.cometd.unsubscribe("/stock/YHOO", this,"");
+ dojox.cometd.unsubscribe("/stock/SPRG", this,"");
+ dojox.cometd.endBatch();
+ });
+
+
+dojo.addOnLoad(function() {
+ dojox.cometd.init("/cometd/cometd");
+ dojox.cometd.startBatch();
+ dojox.cometd.subscribe("/stock/GOOG", onMsgEvent);
+ dojox.cometd.subscribe("/stock/YHOO", onMsgEvent);
+ dojox.cometd.subscribe("/stock/SPRG", onMsgEvent);
+ dojox.cometd.endBatch();
+});
+
+
+function trim(str) {
+ return str.replace(/(^\s+|\s+$)/g,'');
+}
+
+
+function clear() {
+ dojo.byId("msgtext").value = "";
+ dojo.byId("msgtext").focus();
+}
+
+
+function enterKeyHandler(e) {
+if (!e) e = window.event;
+ if (e.keyCode == 13) {
+ send(trim(dojo.byId("msgtext").value));
+ clear();
+ }
+
+}
+
+function subscribe(box, symbol) {
+ if (box.checked) {
+ dojox.cometd.subscribe("/stock/"+symbol, onMsgEvent);
+ } else {
+ dojox.cometd.unsubscribe("/stock/"+symbol, onMsgEvent);
+ }
+}
+
+function removeChildrenFromNode(node)
+{
+ if(node == undefined || node == null)
+ {
+ return;
+ }
+
+ var len = node.childNodes.length;
+
+ while (node.hasChildNodes())
+ {
+ node.removeChild(node.firstChild);
+ }
+}
+
+function onMsgEvent(event) {
+ // Break apart the text string into screen name and message parts.
+ var symbol = event.data.symbol;
+ var price = event.data.price;
+ var pricechange = event.data.change;
+ //alert("symbol: "+symbol+" price: "+price+" change: "+pricechange);
+
+ var pricenode = dojo.byId("price."+symbol);
+ var changenode = dojo.byId("change."+symbol);
+ removeChildrenFromNode(pricenode);
+ removeChildrenFromNode(changenode);
+ var pricelabel = document.createTextNode(price);
+ pricelabel.value = price;
+ var changelabel = document.createTextNode(pricechange);
+ changelabel.value = pricechange;
+ pricenode.appendChild(pricelabel);
+ changenode.appendChild(changelabel);
+}
+
+
+</script>
+</head>
+<body bgcolor="#ffffff">
+<h1 align="center">Bayeux Stock Ticker</h1>
+<h2 align="left"> </h2>
+<p>
+<table cellspacing="0" cellpadding="3" width="100%" align="center" border="0">
+ <tr>
+ <td>SYMBOL</td>
+ <td>PRICE</td>
+ <td>LAST CHANGE</td>
+ <td>SUBSCRIBE</td></tr>
+ <tr>
+ <td>SPRG</td>
+ <td id="price.SPRG"></td>
+ <td id="change.SPRG"></td>
+ <td id="check.SPRG"><input type="checkbox" id="check.SPRG" checked></td>
+ </tr>
+ <tr>
+ <td>GOOG</td>
+ <td id="price.GOOG"></td>
+ <td id="change.GOOG"></td>
+ <td id="check.GOOG"><input type="checkbox" id="check.GOOG" checked></td>
+ </tr>
+ <tr>
+ <td>YHOO</td>
+ <td id="price.YHOO"></td>
+ <td id="change.YHOO"></td>
+ <td id="check.YHOO"><input type="checkbox" id="check.GOOG" checked></td>
+ </tr>
+</table>
+</p>
+</body>
+</html>
\ No newline at end of file
Modified: tomcat/trunk/webapps/cometd/index.html
URL:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/cometd/index.html?rev=706696&r1=706695&r2=706696&view=diff
==============================================================================
--- tomcat/trunk/webapps/cometd/index.html (original)
+++ tomcat/trunk/webapps/cometd/index.html Tue Oct 21 11:07:04 2008
@@ -3,4 +3,5 @@
<p>
Try the <a href="examples/simplechat/cometdchat.htm">Simple Chat Demo</a>.</br>
+Try the <a href="examples/simplechat/ticker.html">Stock Ticker Demo</a>.</br>
</p>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]