网友的提问:

项目中用到了dwr消息推送。而服务端是通过一个http请求后 触发dwr中的推送方法。而单个tomcat中。服务器发送的http请求和用户都在一个tomcat服务器中。这样就能精准推送到每个客户端用户 中。现在配置了apache集群后,通过负载均衡,apache把服务器的这个http请求也给分配给一个tomcat容器中。这样的话,在别的tomcat容器中的用户就接受不要消息了。有什么好的办法让这个请求分配给每个tomcat容器。


 

使用DWR反转实现信息推送(一)

 

除了利用Pushlet实现信息推送外,DWR反转同样可以实现推送。

DWR的简单配置方法已经在以前的博客中写过。所以这里直接贴代码:

新建web工程,这里命名为DwrEg,包结构如下:

dwr消息推送和tomcat集群_推送

web.xml代码如下:




Xml代码   dwr消息推送和tomcat集群_html_02

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  3.     xmlns="http://java.sun.com/xml/ns/javaee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  7.   <servlet>  
  8.       <servlet-name>dwr-invoke</servlet-name>  
  9.       <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>  
  10.      <init-param>  
  11.          <param-name>debug</param-name>  
  12.          <param-value>true</param-value>   
  13.      </init-param>  
  14.      <init-param>  
  15.          <param-name>activeReverseAjaxEnabled</param-name>  
  16.          <param-value>true</param-value>  
  17.      </init-param>    
  18.      <!--   
  19.      <init-param>  
  20.          <param-name>classes</param-name>  
  21.          <param-value>java.lang.Object</param-value>  
  22.         </init-param> -->  
  23.   </servlet>  
  24.   
  25.   <servlet-mapping>  
  26.      <servlet-name>dwr-invoke</servlet-name>  
  27.      <url-pattern>/dwr/*</url-pattern>  
  28.   </servlet-mapping>  
  29.   <welcome-file-list>  
  30.     <welcome-file>client.html</welcome-file>  
  31.   </welcome-file-list>  
  32. </web-app>  


 

dwr.xml代码如下:




Xml代码   dwr消息推送和tomcat集群_html_02

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr//dwr20.dtd">  
  3. <dwr>  
  4.     <allow>   
  5.         <create javascript="myrevsrse" creator="new">  
  6.             <param name="class" value="com.src.MyReverse"/>  
  7.         </create>  
  8.    </allow>  
  9. </dwr>  


 MyReverse.java代码如下:




Java代码   dwr消息推送和tomcat集群_html_02

  1. package com.src;  
  2.   
  3. import java.util.Collection;  
  4.   
  5. import org.directwebremoting.ScriptBuffer;  
  6. import org.directwebremoting.ScriptSession;  
  7. import org.directwebremoting.ServerContext;  
  8. import org.directwebremoting.ServerContextFactory;  
  9. import org.directwebremoting.WebContext;  
  10. import org.directwebremoting.WebContextFactory;  
  11. import org.directwebremoting.proxy.dwr.Util;  
  12.   
  13. public class MyReverse {  
  14.     public void sendMes(String mes){  
  15.         System.out.println("kao shi si bestllll...");  
  16.         send("系统消息:"+mes);  
  17.     }  
  18.     public void send(final String output) {  
  19.         org.directwebremoting.WebContext web = WebContextFactory.get();    
  20.         String page = web.getServletContext().getContextPath()+"/client.html";   
  21.           
  22.         Collection sessions = web.getScriptSessionsByPage(page);     
  23.         System.out.println("size=="+sessions.size());  
  24.            
  25.         Util utilAll = new Util(sessions);    
  26.         
  27.         utilAll.addFunctionCall("callBack", output); //callBack是client.jsp里面的javascript函数,output是传递过去的参数  
  28.         //utilAll.setValue("news_id", output, false);     
  29.         //这种方法也可以,直接将client.html里id为news_id的textarea的值设置为output的值       
  30.     }  
  31.   
  32.     public void noticeNewOrder(int id) {  
  33.         WebContext wctx = WebContextFactory.get();  
  34.         ScriptBuffer script = new ScriptBuffer();  
  35.         script.appendScript("receiveMessages(")  
  36.                 .appendData(id)  
  37.                 .appendScript(");");  
  38.   
  39.         ServerContext sctx = ServerContextFactory.get(wctx.getServletContext());  
  40.         Collection<ScriptSession> pages = sctx.getScriptSessionsByPage("/DwrEg/client.html");  
  41.           
  42.         for (ScriptSession session : pages) {  
  43.             session.addScript(script);  
  44.         }  
  45.     }  
  46. }  


 client.html代码如下:




Html代码   dwr消息推送和tomcat集群_html_02

  1. <html>  
  2. <script type="text/javascript" src="dwr/engine.js"></script>  
  3. <script type="text/javascript" src="dwr/util.js"></script>  
  4. <head>  
  5. <script type="text/javascript">  
  6.   
  7.     function callBack(data){      
  8.            alert(data);     
  9.         }    
  10.     function receiveMessages(id) {  
  11.             $('orderNotice').innerHTML = "收到id为" + id + "的新订单!";  
  12.             $('orderNotice').show();  
  13.         }  
  14.      
  15. </script>  
  16. </head>  
  17. <body onload="dwr.engine.setActiveReverseAjax(true);">  
  18. <textarea rows="20" cols="20" id="news_id"></textarea>  
  19. <br />   
  20. <div id="orderNotice"></div>   
  21. </body>  
  22. </html>  


 推送界面dopush.html的代码如下:




Html代码   dwr消息推送和tomcat集群_html_02

  1. <html>  
  2. <script type="text/javascript" src="dwr/engine.js"></script>  
  3. <script type="text/javascript" src="dwr/util.js"></script>  
  4. <script type="text/javascript" src="dwr/interface/myrevsrse.js"></script>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
  7. <title>Insert title here</title>  
  8. <script type="text/javascript">  
  9.     function sendnews(){   
  10.         var new_content = dwr.util.getValue("newcontent");  
  11.         myrevsrse.sendMes(new_content);  
  12.     }  
  13.       
  14.     function sendinfo(){   
  15.        myrevsrse.noticeNewOrder(12);  
  16.     }    
  17. </script>  
  18. </head>  
  19. <body>  
  20. <input type="text" name="newcontent">  
  21. <input type = "button" value="发消息" onclick="sendnews()"/>   
  22. <br />  
  23. <input type = "button" value="send 2" onclick="sendinfo()"/>  
  24. <br />    
  25. </body>  


 同样,这里的问题也是怎么实现点对点的信息推送,这儿只是实现了向所有的clent.html页面推送信息,以后接着总结。。。。

 

 ​