`
shihuan830619
  • 浏览: 583851 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Pushlet和Dwr的简单服务器推技术

阅读更多
附件里Pushlet和Dwr3.0的简单服务器推技术。

DWR-Source.rar为DWR的学习资料。

下面简单介绍一下dwr3.0 RC2版本的反推技术代码。

首先下载dwr官方包,笔者这里下载的是dwr3.0 RC2开发包。
把dwr.jar和engine.js等相关文件放入web工程里。
首先在web.xml文件的同级目录建立dwr.xml文件,其内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd">

<dwr>

	<allow>
		
		<!-- stockpusher -->
		<create creator="new" scope="application" javascript="StocksPusher">
		  <param name="class" value="com.shihuan.dragonkeeper.server.reverseajax.stockspusher.StocksPusher"/>
		</create>
		
	</allow>

</dwr>


在web.xml文件中要加入如下代码:
<listener>
    <listener-class>org.directwebremoting.servlet.DwrListener</listener-class>
  </listener>
  
  <servlet>
  	<servlet-name>dwr-invoker</servlet-name>
    <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
	
    <init-param>
      <param-name>debug</param-name>
      <param-value>true</param-value>
    </init-param>
  
	<init-param>
      <param-name>accessLogLevel</param-name>
      <param-value>runtimeexception</param-value>
    </init-param>
    
    <init-param>
      <param-name>activeReverseAjaxEnabled</param-name>
      <param-value>true</param-value>
    </init-param>

    <init-param>
      <param-name>initApplicationScopeCreatorsAtStartup</param-name>
      <param-value>true</param-value>
    </init-param>

    <init-param>
      <param-name>jsonRpcEnabled</param-name>
      <param-value>true</param-value>
    </init-param>

    <init-param>
      <param-name>jsonpEnabled</param-name>
      <param-value>true</param-value>
    </init-param>
    
    <init-param>
      <param-name>preferDataUrlSchema</param-name>
      <param-value>false</param-value>
    </init-param>
    //下面这句要看你的web工程中是否有优先于dwr启动的文件
    <load-on-startup>2</load-on-startup>
    
  </servlet>
  <servlet-mapping>
    <servlet-name>dwr-invoker</servlet-name>
    //下面的resources目录的意思是笔者dwr的引擎文件是放在WebRoot/resources/dwr目录下面的(engine.js)
    <url-pattern>/resources/dwr/*</url-pattern>
  </servlet-mapping>


StocksPusher.java代码如下:
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.directwebremoting.Browser;
import org.directwebremoting.ScriptSessions;
import org.directwebremoting.impl.DaemonThreadFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;
import com.shihuan.dragonkeeper.common.dto.DataSourceInfo;
import com.shihuan.dragonkeeper.common.utils.DataSourceMapUtil;
import com.shihuan.dragonkeeper.common.utils.PropertiesUtil;
import com.shihuan.dragonkeeper.global.ConfigFile;
import com.shihuan.dragonkeeper.server.bean.StocksBean;

public class StocksPusher implements Runnable {
	
	protected static Logger logger = LoggerFactory.getLogger(StocksPusher.class);
	
	private static String jdbc_CONFIG = ConfigFile.JDBC_CONFIG + ConfigFile.SUFFIX_NAME;

	private static boolean closeMarket = false;
	
	
	public StocksPusher() {
		ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1, new DaemonThreadFactory());
		executor.scheduleAtFixedRate(this, 1L, 50L, TimeUnit.MILLISECONDS);
	}
	
	@Override
	public void run() {
		
		if (!closeMarket) {
			StocksBean stock = StockPriceTracer.getNextStockInfo();  //获取后台数据
			
//			setMessageToPage(stock.getStock(), stock.getValue());  //非JSON版本
			
			insertDbData(stock);
			setJsonMessageToPage(JSON.toJSON(stock));
			
		} 
		
	}
	
	public void setJsonMessageToPage(final Object json){
		Browser.withAllSessions(new Runnable() {
			public void run() {
				ScriptSessions.addFunctionCall("showJsonMessage", json);
			}
		});
	}
	
	public void setMessageToPage(final String key, final String message){
		Browser.withAllSessions(new Runnable() {
			public void run() {
				ScriptSessions.addFunctionCall("showMessage", key, message);
			}
		});
	}
	
	public void insertDbData(final StocksBean data){
		Thread t = new Thread(new Runnable() {
			@Override
			public void run() {
				String sql = "insert into stocks(stock,value) values (?,?)";
				QueryRunner queryRunner = new QueryRunner(true);
				Connection conn = null;
				
				DataSourceInfo dsObj = new DataSourceInfo();
				try {
					dsObj.setDriverClass(PropertiesUtil.getPropertiesValue(jdbc_CONFIG, "mysql.driverclass"));
					dsObj.setJdbcUrl(PropertiesUtil.getPropertiesValue(jdbc_CONFIG, "mysql.jdbcurl"));
					dsObj.setUser(PropertiesUtil.getPropertiesValue(jdbc_CONFIG, "mysql.user"));
					dsObj.setPassword(PropertiesUtil.getPropertiesValue(jdbc_CONFIG, "mysql.password"));
					conn = DataSourceMapUtil.getConnection(dsObj);
					queryRunner.update(conn, sql, data.getStock(), data.getValue());
					DbUtils.commitAndCloseQuietly(conn);
				} catch (ConfigurationException e) {
					DbUtils.rollbackAndCloseQuietly(conn);
					logger.error(e.getMessage(), e);
					e.printStackTrace();
				} catch (SQLException e) {
					DbUtils.rollbackAndCloseQuietly(conn);
					logger.error(e.getMessage(), e);
					e.printStackTrace();
				} catch (IOException e) {
					DbUtils.rollbackAndCloseQuietly(conn);
					logger.error(e.getMessage(), e);
					e.printStackTrace();
				} finally {
					try {
						if (conn != null && !conn.isClosed()) {
							conn.close();
						}
					} catch (SQLException e) {
						logger.error(e.getMessage(), e);
						e.printStackTrace();
					}
				}
				
			}
		});
		
		t.start();
	}

	public void beginShow() {
		closeMarket = false;
	}

	public void closeShow() {
		closeMarket = true;
	}

}


StockPriceTracer.java代码如下:
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Stack;

import com.shihuan.dragonkeeper.server.bean.StocksBean;

public class StockPriceTracer {

	private static StockPriceTracer tracer = null;
	private List<StocksBean> stocks = new ArrayList<StocksBean>();
	private Stack<StocksBean> cycleStack = new Stack<StocksBean>();

	private StockPriceTracer() {
		stocks.add(new StocksBean("zsy", "36.55"));
		stocks.add(new StocksBean("dlsd", "91.01"));
		stocks.add(new StocksBean("zsh", "22.59"));
		stocks.add(new StocksBean("lggf", "5.07"));
		stocks.add(new StocksBean("hedq", "71.77"));
		stocks.add(new StocksBean("jdsn", "31.61"));
		stocks.add(new StocksBean("yyrj", "51.29"));
		stocks.add(new StocksBean("zsyh", "52.70"));
		stocks.add(new StocksBean("zgtj", "16.96"));
		stocks.add(new StocksBean("sfz", "54.34"));
		stocks.add(new StocksBean("jsrj", "178.48"));
		stocks.add(new StocksBean("zyd", "134.48"));
		stocks.add(new StocksBean("jzg", "76.32"));
		stocks.add(new StocksBean("zgpa", "80.63"));
		stocks.add(new StocksBean("gsyh", "18.79"));
		stocks.add(new StocksBean("aggf", "20.19"));
		stocks.add(new StocksBean("zght", "11.13"));
	}

	public static StocksBean getNextStockInfo() {
		if (null == tracer) {
			tracer = new StockPriceTracer();
		}
		
		if (tracer.cycleStack.empty()) {
			tracer.cycleStack.addAll(tracer.stocks);
		}
		
		StocksBean tmp = tracer.cycleStack.pop();
		tmp.setValue(tracer.getRandomPrice(tmp.getValue()));
		return tmp;
	}

	private String getRandomPrice(String current) {
		float fcurrent = 0.0F;
		try {
			fcurrent = Float.parseFloat(current);
		} catch (NumberFormatException e) {
			fcurrent = 0.01F;
		}
		Random rdm = new Random();
		float tmp = fcurrent + rdm.nextFloat();
		return String.valueOf(tmp);
	}
	
}


StocksPusher.jsp代码如下:
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ page isELIgnored="false" %>
<fmt:requestEncoding value="UTF-8"/>
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
<c:set var="requestURI" value="${pageContext.request.servletPath}"/>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>My Dwr Reverse Ajax Test For StocksInfo</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

	<link rel="stylesheet" type="text/css" href="${ctx}/resources/dwr/css/generic.css" />

	<script type='text/javascript' src='${ctx}/resources/dwr/engine.js'></script>
	<script type='text/javascript' src='${ctx}/resources/dwr/util.js'></script>
	<script type='text/javascript' src='${ctx}/resources/dwr/interface/StocksPusher.js'></script>
	  
	  
	<script type="text/javascript" src="${ctx}/resources/appbusiness/stockspusher/StocksPusher.js"></script>

</head>
  
  <body>
    
		<h3>使用DWR Reverse Ajax进行股票报盘</h3>
		<p>下面显示的股票信息是可以动态变化的</p>
		<input type="button" value="开市..." onclick="beginShow();" />
		=========================
		<input type="button" value="闭市..." onclick="endShow();" />
		<hr />
		
		<table style="width:500px;" border="0" cellpadding="0">
			<tr>
				<td class="headName">
					<b>Stock Name</b>
				</td>
				<td class="headValue" >
					<b>Stock Value</b>
				</td>
			</tr>
			
			<tr><td>中移动</td><td><div id="zyd">wait...</div></td></tr>
			<tr><td>中石化</td><td><div id="zsh">wait...</div></td></tr>
			<tr><td>中石油</td><td><div id="zsy">wait...</div></td></tr>
			<tr><td>海尔电器</td><td><div id="hedq">wait...</div></td></tr>
			<tr><td>冀东水泥</td><td><div id="jdsn">wait...</div></td></tr>
			<tr><td>用友软件</td><td><div id="yyrj">wait...</div></td></tr>
			<tr><td>柳钢股份</td><td><div id="lggf">wait...</div></td></tr>
			<tr><td>招商银行</td><td><div id="zsyh">wait...</div></td></tr>
			<tr><td>中国铁建</td><td><div id="zgtj">wait...</div></td></tr>
			<tr><td>深发展</td><td><div id="sfz">wait...</div></td></tr>
			<tr><td>金山软件</td><td><div id="jsrj">wait...</div></td></tr>
			<tr><td>大连实德</td><td><div id="dlsd">wait...</div></td></tr>
			<tr><td>九寨沟</td><td><div id="jzg">wait...</div></td></tr>
			<tr><td>中国平安</td><td><div id="zgpa">wait...</div></td></tr>
			<tr><td>工商银行</td><td><div id="gsyh">wait...</div></td></tr>
			<tr><td>鞍钢股份</td><td><div id="aggf">wait...</div></td></tr>
			<tr><td>中国航天</td><td><div id="zght">wait...</div></td></tr>
			
		</table>
		
		<br />

  </body>
  
</html>


StocksPusher.js代码如下:
window.onload = function() {
	dwr.engine.setActiveReverseAjax(true);
};


function beginShow() {
	StocksPusher.beginShow();
}

function endShow() {
	StocksPusher.closeShow();
}

//JSON版本
function showJsonMessage(json){
    if(json['stock'] != undefined || json['value'] != undefined){
	document.getElementById(json['stock']).innerHTML = json['value'];
    }
}

//非JSON版本
function showMessage(key, value){
	document.getElementById(key).innerHTML = value;
}
分享到:
评论
1 楼 wwshouhui 2014-04-19  
学习下,谢谢!

相关推荐

    pushlet服务器推技术例子

    【Pushlet服务器推技术】是一种实时通信技术,主要用于构建能够实时推送信息的Web应用程序,比如聊天、股票更新、在线游戏等场景。Pushlet是基于Java的开源项目,它利用了HTTP的长连接特性,实现了服务器主动向...

    dwr服务器推技术实例

    总之,DWR的服务器推技术通过`TestReverseAjax`和`TestPushlet`提供了强大的实时通信能力,让Web应用能够实现类似桌面应用的即时反馈,极大地提升了用户体验。然而,实施这一技术时,也需要充分考虑性能优化和资源...

    服务器推送pushlet讲解

    Pushlet是基于Comet技术的一种实现,它为Java开发者提供了一种高效的服务器推送解决方案。 一、Comet技术 Comet是一种允许服务器长时间保持HTTP连接的技术,它打破了传统的Web应用模型,即客户端发起请求,服务器...

    PushLet实例,服务器消息推送

    【标题】"PushLet实例,服务器消息推送"指的是一个基于Java技术实现的服务器端消息推送系统,名为PushLet。在互联网应用中,实时性是非常重要的一个特性,例如在线聊天、股票更新、新闻推送等场景。传统的HTTP协议是...

    pushlet jar包下载

    服务器推 pushlet 服务器推 pushlet 服务器推 pushlet 服务器推 pushlet

    pushlet服务器推送技术

    ### Pushlet 服务器推送技术详解 #### 一、引言 在IBM于2008年发布的技术报告中,详细介绍了服务器推送技术——即所谓的Pushlet。这项技术为Web应用程序的发展带来了革命性的变化,尤其是在异步通信方面。本文将...

    服务器推送 pushlet

    在Pushlet的实现中,主要有两个关键角色:Pushlet Server(推送服务器)和Pushlet Client(推送客户端)。Pushlet Server负责接收来自客户端的连接,并在有新数据时主动将数据推送到这些连接。Pushlet Client则建立...

    http长连接(服务器推)使用pushlet教程示例以及jar包源码

    Pushlet Server负责接收和处理客户端的连接,Pushlet Client则作为客户端应用程序,负责建立和保持与服务器的连接,Event Dispatcher则根据需求将事件推送到特定的客户端。 在Pushlet框架中,"一对多"的信息推送...

    基于comet服务器推技术思路的Pushlet技术实现1

    总结起来,基于Comet的Pushlet技术通过长轮询和流方式实现了高效的服务器向客户端的数据推送,有效地解决了Web实时通信的问题,尤其适用于需要实时交互的场景。无论是长轮询还是流方式,都利用了HTTP连接的持久性,...

    pushlet实现服务器端向客户端推送消息总结

    Pushlet 是一种基于 Java 的实时通信框架,用于实现在服务器端向客户端主动推送消息的功能,而无需客户端不断轮询。这种技术在构建实时应用程序,如聊天室、实时股票更新或在线游戏等场景中非常有用。以下是关于 ...

    pushlet实例(java服务端推送消息)

    实现多个客户端连接到web服务器,由服务端推送消息至客户端(或指定id的客户端),代码中没有用官网的jar文件,而是用的源码,做了一定的修改,实现了每个客户端都可以自定义id,然后服务端可以向指定id客户端推送消息...

    pushlet定时向前台推送消息

    Pushlet是一种基于Java的技术,用于实现服务器向客户端的实时数据推送。这种技术的核心思想是打破传统的HTTP请求-响应模式,让服务器能够在数据更新时主动将信息推送给客户端,而不是等待客户端发起新的请求来获取...

    服务器推送——PushLet的应用<一>

    【服务器推送技术——PushLet应用详解&lt;一&gt;】 在当今的互联网应用中,实时性成为了不可或缺的需求,无论是即时通讯、在线游戏还是股票交易,都需要服务器能够主动向客户端推送信息,而不是传统的请求-响应模式。这...

    基于pushlet实现的jsp网站消息推送

    Pushlet的优势在于其简单易用的API和对Java环境的良好支持,使得开发者能快速实现服务器到客户端的数据推送。然而,它也有一定的局限性,如对浏览器兼容性的限制(需要支持持久连接的浏览器),以及可能面临的连接...

    基于Pushlet推技术的网络应用程序开发的研究

    【基于Pushlet推技术的网络应用程序开发的研究】这篇论文探讨了Pushlet技术在构建网络应用程序中的应用,Pushlet是一种服务器推(Server Push)技术,它允许服务器主动地将实时更新的数据推送到客户端的浏览器,而...

    使用Pushlet来实现服务器端向客户端推送信息

    使用Pushlet来实现服务器端向客户端推送信息

    Pushlet简单示例测试

    总结来说,Pushlet简单示例测试是一个实践性的教程,它涵盖了Pushlet技术的基础应用,包括服务器端的设置、客户端的连接建立以及数据推送的处理。通过这个测试,开发者可以深入理解Pushlet的工作机制,并在实际项目...

    pushlet例子

    Pushlet是服务器推送技术的一种早期实现,由Jackrabbit项目开发,它基于Java Servlet和JavaServer Pages (JSP) 技术。Pushlet的核心理念是通过长连接保持客户端与服务器之间的通信,从而实现实时数据推送。 Pushlet...

    Pushlet后台往jsp前台推送消息实例

    在IT行业中,推送技术是一种常见的实时通信方式,它允许服务器主动向客户端发送数据,而无需客户端不断地轮询请求。Pushlet框架就是这种技术的一种实现,主要用于构建基于HTTP长连接的实时信息发布系统。在这个...

Global site tag (gtag.js) - Google Analytics