Pushlet 및 Dwr의 간단한 서버 푸시 기술

15303 단어 PushletDWR3
첨부 파일에 Pushlet과 Dwr3.0의 간단한 서버 푸시 기술.
DWR-Source.rar은 DWR의 학습 자료입니다.
다음은 간단하게 dwr3을 소개합니다.0 RC2 버전의 역추적 기술 코드입니다.
먼저 dwr 공식 패키지를 다운로드합니다. 필자가 여기에서 다운로드한 것은 dwr3입니다.0 RC2 개발 키트.
dwr.jar와engine.js 등 관련 파일을 웹 프로젝트에 넣습니다.
우선 웹에서.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>

웹에서.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;
}

좋은 웹페이지 즐겨찾기