浏览 11503 次
锁定老帖子 主题:ActiveMQ Ajax研究
精华帖 (0) :: 良好帖 (2) :: 新手帖 (11) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-08-16
最后修改:2010-08-16
学习了ActiveMQ官方的例子,自己也尝试了一下,下面是贴一些代码,比官方的例子要简单得多。 这是web.xml,配置了ActiveMQ的AjaxServlet,连接的是本机启动ActiveMQ的服务地址tcp://localhost:61616(ActiveMQ默认的) <?xml version="1.0" encoding="UTF-8"?> <web-app …> <context-param> <param-name>org.apache.activemq.brokerURL</param-name> <param-value>tcp://localhost:61616</param-value> <description>The URL of the Message Broker to connect to</description> </context-param> <servlet> <servlet-name>AjaxServlet</servlet-name> <servlet-class>org.apache.activemq.web.AjaxServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>AjaxServlet</servlet-name> <url-pattern>/amq/*</url-pattern> </servlet-mapping> </web-app> 然后是页面: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script type="text/javascript" src="amq/amq.js"></script> <script type="text/javascript">amq.uri='amq';</script> <script type="text/javascript" src="jquery/jquery-1.4.2.js"></script> <script type="text/javascript"> function listener(message) { jQuery("#receive").append("<p>" + message.nodeType + "." + message.nodeValue + "</p>"); }; function pollHandler(first) { if (first) { amq.addListener("test", "topic://test", listener); } }; jQuery(function(){ jQuery("#send").click(function(){ amq.sendMessage("topic://test", "[\"Hello\", \"Hello\"]"); }); jQuery("#clear").click(function(){ jQuery("#receive").html(""); }); amq.addPollHandler(pollHandler); }) </script> </head> <body> <button id="send">发送</button> <button id="clear">清理</button> <div id="receive"></div> </body> </html> “发送”按钮发送消息到主题topic://test,接收到的消息直接填到div中。 同时我也写了一个Java程序来发送和接收消息,只贴发送消息的代码: private static Destination destination; private static String user = ActiveMQConnection.DEFAULT_USER; private static String password = ActiveMQConnection.DEFAULT_PASSWORD; private static String url = "tcp://localhost:61616"; private static String subject = "test"; public static void main(String[] args) { Connection connection = null; try { ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(user, password, url); connection = connectionFactory.createConnection(); connection.start(); // Create the session Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); destination = session.createTopic(subject); // Create the producer. MessageProducer producer = session.createProducer(destination); // Start sending messages producer.send(session.createTextMessage("<message>Hello</message>[\"Hello\", \"Hello\"]")); } catch (Exception e) { System.out.println("Caught: " + e); e.printStackTrace(System.out); } finally { try { connection.close(); } catch (Throwable ignore) { } } } 使用Firefox+Firebug设置断点跟踪研究,通过Ajax发送的消息统统是纯文本的,Java程序发送的文本内容Ajax同样能够接收到,而Ajax发送的消息Java程序也能接收到,类型为TextMessage,但是Ajax中接收的消息比较要命,我倒腾了半天才发现其中的诀窍。 ActiveMQ Ajax是通过HTTP长连接接收消息的,接收到的原始消息格式大概是下面的样子: <ajax-response> <response id="test" destination="topic://test">消息内容</response> </ajax-response> id就是amq.addListener函数的第一个参数,标志Listener的,destination就是消息主题,这些都没问题,最要命的是ActiveMQ自动把消息内容解释成了DOM格式,也就是说Listener回调函数中的message参数是DOM结构的,如果是XML,那就得按照DOM的Element类型来解析,如果不是XML,那就是Text类型的,更有意思的是如果像这样一个消息:“<message>aaa</message><message>bbb</message>”,那么Listener回调函数会执行两次,因为里面包含了两个Element,如果是这样的消息:“<message>aaa</message>asdfasdfaksd”, Listener回调函数也会执行两次,““<message>aaa</message>”是Element,而“asdfasdfaksd”是Text,呵呵。 这就更加坚定了我使用Json的决心,解析由我自己做,省得和ActiveMQ撤不清。 参考: http://activemq.apache.org/ajax.html http://www.w3.org/TR/DOM-Level-3-Core/core.html 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-08-24
JMS主要连接多个系统用的, 做服务器推送,还是算了吧···
用flash 或者 applet 推,比这个号。。 |
|
返回顶楼 | |
发表时间:2010-08-24
看了之后很受启发,不知道网站统计用这种思路怎么样?
---------------- ps:ls要是排排版就好了 |
|
返回顶楼 | |
发表时间:2010-08-26
witcheryne 写道 JMS主要连接多个系统用的, 做服务器推送,还是算了吧···
用flash 或者 applet 推,比这个号。。 纯Web才是终极解决方案,道理不多讲 |
|
返回顶楼 | |
发表时间:2010-08-26
楼主有没有搞过聊天室啊?私聊 群聊怎么做的?
|
|
返回顶楼 | |
发表时间:2010-12-02
godson_2003 写道 楼主有没有搞过聊天室啊?私聊 群聊怎么做的?
聊天是可以考虑用 ZeroMQ, 效率相当高``` 不过IM的东西,建议用XMPP协议来搞.. |
|
返回顶楼 | |
发表时间:2010-12-02
只能说你用错地方了,MQ是做消息可靠性的。
|
|
返回顶楼 | |
发表时间:2010-12-02
最后修改:2010-12-02
绑住JMS协议作ajax,amq跨平台用的openwire,在你的场景都是不合适的。
|
|
返回顶楼 | |