作者:じ☆ve宝贝
发布时间:2016-08-16T18:03:30
web.xml
<!-- comet4j消息推送 -->
<listener>
<description>Comet4J容器侦听</description>
<listener-class>org.comet4j.core.CometAppListener</listener-class>
</listener>
<servlet>
<description>Comet连接[默认:org.comet4j.core.CometServlet]</description>
<display-name>CometServlet</display-name>
<servlet-name>CometServlet</servlet-name>
<servlet-class>org.comet4j.core.CometServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CometServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
<listener>
<description>CometListener</description>
<listener-class>cn.harvetech.listener.CometListener</listener-class>
</listener>
Const.java
public static final String MSG_CHANEL = "studyjava";
CometListener
package cn.harvetech.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.comet4j.core.CometConnection;
import org.comet4j.core.CometContext;
import org.comet4j.core.CometEngine;
import org.comet4j.core.event.ConnectEvent;
import org.comet4j.core.event.DropEvent;
import org.comet4j.core.listener.ConnectListener;
import org.comet4j.core.listener.DropListener;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import cn.studyjava.service.RedisService;
import cn.studyjava.util.Const;
/**
*
* 作者: zsljava
* 邮件: zsljava@163.com
* 时间: 2016年3月28日 下午5:11:56
* 描述: 消息推送监听器
* 注意: tomcat7的jar包 comet4j-tomcat7.jar
* tomcat6的jar包 comet4j-tomcat6.jar
* tomcat下server.xml的配置
* <Connector URIEncoding="UTF-8" connectionTimeout="20000" port="80"
* protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>
* protocol 连接方式修改成为nio的的就行了
* 注意listener生命周期不受spring管理 在listener中使用spring的beans需要用WebApplicationContextUtils
*/
public class CometListener implements ServletContextListener{
private static Logger logger = Logger.getLogger(CometListener.class);
private RedisService redisService;
public void contextInitialized(ServletContextEvent sce) {
CometContext cc = CometContext.getInstance();
cc.registChannel(Const.MSG_CHANEL);// 注册应用的channel
CometEngine engine = cc.getEngine();
engine.addConnectListener(new JoinListener()); //上线通知
engine.addDropListener(new LeftListener()); //离线通知
WebApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(cc.getServletContext());
redisService = (RedisService) context.getBean("redisService"); //获取redis
logger.info("初始化comet4j消息推送框架");
}
class JoinListener extends ConnectListener {
public boolean handleEvent(ConnectEvent anEvent) {
CometConnection conn = anEvent.getConn();
redisService.set(conn.getRequest().getSession().getId(), conn.getId());//客户端连接后存储ChanelId
logger.info("接入ChanelId为:"+conn.getId() +",redis存储key为:"+conn.getRequest().getSession().getId());
CometEngine engine = CometContext.getInstance().getEngine();
engine.sendTo(Const.MSG_CHANEL, engine.getConnection(conn.getId()), "欢迎您,sessionid为:"+conn.getRequest().getSession().getId());
return true;
}
}
class LeftListener extends DropListener {
public boolean handleEvent(DropEvent anEvent) {
CometConnection conn = anEvent.getConn();
if (conn != null) {
HttpServletRequest request = conn.getRequest();
redisService.del(request.getSession().getId());
logger.info("删除ChanelId为:"+conn.getId() +",redis存储key为:"+conn.getRequest().getSession().getId());
CometEngine engine = CometContext.getInstance().getEngine();
engine.sendTo(Const.MSG_CHANEL, engine.getConnection(conn.getId()), "删除,sessionid为:"+conn.getRequest().getSession().getId());
}
return true;
}
}
public void contextDestroyed(ServletContextEvent sce) {
}
}
jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Comet4J Hello World</title>
<script type="text/javascript" src="js/comet4j.js"></script>
<script type="text/javascript">
function init(){
var kbDom = document.getElementById('kb');
JS.Engine.on({
start : function(cId, channelList, engine){
// document.getElementById('cid').innerHTML=cId;
alert('连接已建立,连接ID为:' + cId);
},
stop : function(cause, cId, url, engine){
alert('连接已断开,连接ID为:' + cId + ',断开原因:' + cause + ',断开的连接地址:'+ url);
},
harvetech : function(kb){//侦听一个channel
kbDom.innerHTML = kb;
}
});
JS.Engine.start('test');
}
</script>
</head>
<body onload="init()">
comet4j消息推送:<span id="kb">...</span>
</body>
</html>