comet4j java服务端推送消息到web页面实例

来源:互联网 发布:约瑟夫环c语言链表 编辑:程序博客网 时间:2024/05/17 04:43

原文在这里:http://blog.csdn.net/shadowsick/article/details/9014139 

 对于页面一直监控,以前都是使用ajax请求即可,但是小并发这做法没多大问题,但是到了大并发就不太合适,如果不想自己写线程来操控就可以偷懒找一些插件,例如comet4j

下面我来演示下如何使用这个插件

      先准备需要的工具:

comet4j-tomcat6.jar(tomcat6的就导入这个)

comet4j-tomcat7.jar(tomcat7的就导入这个)

comet4j.js(页面引入这个js)

具体操作看下面


然后就写个class

[java] view plain copy
  1. package com.shadow.extras.comet4j;  
  2.   
  3. import javax.servlet.ServletContextEvent;  
  4. import javax.servlet.ServletContextListener;  
  5.   
  6. import org.comet4j.core.CometContext;  
  7. import org.comet4j.core.CometEngine;  
  8.   
  9. public class TestComet implements ServletContextListener {  
  10.     private static final String CHANNEL = "test";  
  11.     private static final String CHANNEL2 = "test2";  
  12.   
  13.     public void contextInitialized(ServletContextEvent arg0) {  
  14.         CometContext cc = CometContext.getInstance();  
  15.         cc.registChannel(CHANNEL);// 注册应用的channel  
  16.         cc.registChannel(CHANNEL2);  
  17.   
  18.         Thread helloAppModule = new Thread(new HelloAppModule(),  
  19.                 "Sender App Module");  
  20.         // 是否启动  
  21.         helloAppModule.setDaemon(true);  
  22.         // 启动线程  
  23.         helloAppModule.start();  
  24.   
  25.         Thread helloAppModule2 = new Thread(new HelloAppModule2(),  
  26.                 "Sender App Module");  
  27.         // 是否启动  
  28.         helloAppModule2.setDaemon(true);  
  29.         // 启动线程  
  30.         helloAppModule2.start();  
  31.     }  
  32.   
  33.     class HelloAppModule2 implements Runnable {  
  34.         public void run() {  
  35.             while (true) {  
  36.                 try {  
  37.                     // 睡眠时间  
  38.                     Thread.sleep(5000);  
  39.                 } catch (Exception ex) {  
  40.                     ex.printStackTrace();  
  41.                 }  
  42.                 CometEngine engine = CometContext.getInstance().getEngine();  
  43.                 // 获取消息内容  
  44.                 long l = getFreeMemory();  
  45.                 // 开始发送  
  46.                 engine.sendToAll(CHANNEL2, l);  
  47.             }  
  48.         }  
  49.     }  
  50.   
  51.     class HelloAppModule implements Runnable {  
  52.         public void run() {  
  53.             while (true) {  
  54.                 try {  
  55.                     // 睡眠时间  
  56.                     Thread.sleep(2000);  
  57.                 } catch (Exception ex) {  
  58.                     ex.printStackTrace();  
  59.                 }  
  60.                 CometEngine engine = CometContext.getInstance().getEngine();  
  61.                 // 获取消息内容  
  62.                 long l = getFreeMemory();  
  63.                 // 开始发送  
  64.                 engine.sendToAll(CHANNEL, l);  
  65.             }  
  66.         }  
  67.     }  
  68.   
  69.     public void contextDestroyed(ServletContextEvent arg0) {  
  70.   
  71.     }  
  72.   
  73.     public long getFreeMemory() {  
  74.         return Runtime.getRuntime().freeMemory() / 1024;  
  75.     }  
  76. }  

然后再写个页面


[html] view plain copy
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  5. <title>Comet4J Hello World</title>  
  6. <script type="text/javascript" src="plugin/comet4j/comet4j.js"></script>  
  7. <script type="text/javascript">  
  8. function init(){  
  9.         var kbDom = document.getElementById('kb');  
  10.         var kbDom2 = document.getElementById('kb2');  
  11.         JS.Engine.on({  
  12.                 test : function(aa){//侦听一个channel  
  13.                         kbDom.innerHTML = aa;  
  14.                 },  
  15.                 test2 : function(bb){  
  16.                     kbDom2.innerHTML = bb;  
  17.                 }  
  18.         });  
  19.         JS.Engine.start('comet');  
  20. }  
  21. </script>  
  22. </head>  
  23. <body onload="init()">  
  24.         剩余内存:<span id="kb">...</span>KB <br/>  
  25.         剩余内存:<span id="kb2">...</span>KB  
  26. </body>  
  27. </html>  

接着配置下web.xml就ok了

[html] view plain copy
  1. <!-- comet4j -->  
  2.     <listener>  
  3.         <description>Comet4J容器侦听</description>  
  4.         <listener-class>org.comet4j.core.CometAppListener</listener-class>  
  5.     </listener>  
  6.     <servlet>  
  7.         <description>Comet连接[默认:org.comet4j.core.CometServlet]</description>  
  8.         <display-name>CometServlet</display-name>  
  9.         <servlet-name>CometServlet</servlet-name>  
  10.         <servlet-class>org.comet4j.core.CometServlet</servlet-class>  
  11.     </servlet>  
  12.     <servlet-mapping>  
  13.         <servlet-name>CometServlet</servlet-name>  
  14.         <url-pattern>/comet</url-pattern>  
  15.     </servlet-mapping>  
  16.   
  17.     <listener>  
  18.         <description>TestComet</description>  
  19.         <listener-class>com.shadow.extras.comet4j.TestComet</listener-class>  
  20.     </listener>  

最后修改下tomcat的server.xml文件

把protocol参数值改成下面的,因为这是基于nio开发的插件

[html] view plain copy
  1. <Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>  

测试,很简单就是访问我们刚刚创建的test.html,然后就可以看到内存数值一直自动刷新波动

ps:

(1)与springmvc集成的时候,要注意comet的listener要写在spring的listener之后,这样才能在comet的listener中获取到spring的context。

参考: http://energykey.iteye.com/blog/326303

(2)mvn打包的时候,如何依赖本地包:

maven打包的时候有些jar包是不在mavencenter的。需要在pom中引入相关的本地jar包,那么相关的depency应该像如下更改 <dependency>        <groupId>org.wltea.ik-analyzer</groupId>        <artifactId>ik-analyzer</artifactId>        <version>3.2.8</version>        <scope>system</scope>        <systemPath>${project.basedir}/lib/ik-analyzer-3.2.8.jar</systemPath>    </dependency>对于war包系统来说,有时候需要把jar包打到相关的war包中,可以使用plugin,默认将lib下的所有jar文件打包到WEB-INF/lib下。当然也是可以打包其他的文件的,诸如xml,properties等的。相关的plugin如下:  <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-war-plugin</artifactId>            <version>2.3</version>            <configuration>                <warName>${project.artifactId}</warName>                <webResources>                    <resource>                        <directory>lib/</directory>                        <targetPath>WEB-INF/lib</targetPath>                        <includes>                            <include>**/*.jar</include>                        </includes>                    </resource>                </webResources>            </configuration>        </plugin>
参考:http://my.oschina.net/zimingforever/blog/266191


comet4j用起来还是挺简单的!

0 0