1.简介
Pushlet 是一个开源的 Comet 框架,Pushlet 使用了观察者模式:客户端发送请求,订阅感兴趣的事件;服务器端为每个客户端分配一个会话 ID 作为标记,事件源会把新产生的事件以多播的方式发送到订阅者的事件队列里。表面上是服务器推,实现是还是客户端拉。
2.实现
2.1.发布Event
2.1.1.Local本地
--Dispatcher API
Dispatcher.getInstance().multicast()/unicast()/broadcast().
package com.siyuan.study.pushlet.event; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import nl.justobjects.pushlet.core.Dispatcher; import nl.justobjects.pushlet.core.Event; public class SendEventServlet extends HttpServlet { private static final long serialVersionUID = 1341951769479495126L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Event event = Event.createDataEvent("/myEvent/test"); event.setField("mess", "it is " + System.currentTimeMillis()); Dispatcher.getInstance().broadcast(event); Dispatcher.getInstance().multicast(event); Dispatcher.getInstance().unicast(event, req.getParameter("sessionId")); } }
--EventSource
2.1.2.Remote远程
2.2.获取Event
--DHTML
--AJAX
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Pragma" content="no-cache" /> <script type="text/javascript" src="ajax-pushlet-client.js"></script> <script type="text/javascript"> PL._init(); PL.joinListen('/cuige/he'); function onData(event) { alert(event.get("mess")); // 离开 // PL.leave(); } </script> </head> <body> <center> <h1> my first pushlet! </h1> </center> </body> </html>
--XML
--J2ME
3.其余配置
web.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <!-- $Id: web.xml,v 1.7 2005/02/21 17:21:49 justb Exp $ --> <web-app> <!-- Define the pushlet servlet --> <servlet> <servlet-name>pushlet</servlet-name> <servlet-class>nl.justobjects.pushlet.servlet.Pushlet</servlet-class> <load-on-startup>3</load-on-startup> </servlet> <servlet> <servlet-name>sender</servlet-name> <servlet-class>com.siyuan.study.pushlet.event.SendEventServlet</servlet-class> </servlet> <!-- Define the Servlet Mappings. --> <!-- The pushlet --> <servlet-mapping> <servlet-name>pushlet</servlet-name> <url-pattern>/pushlet.srv</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>sender</servlet-name> <url-pattern>/send</url-pattern> </servlet-mapping> </web-app>
pushlet.properties
4.设计思路
客户端订阅事件时在SessionManager中注册一个Session,并且保存订阅信息Subscriber。Subscriber包含两个重要的属性,subscriptions主题,EventQueue用于存储Event,客户端请求Pushlet从EventQueue中获取Event。
5.参考资料
http://www.pushlets.com/