ActiveMQ消息队列的应用 C#客户端 Web后端

来源:互联网 发布:背包装什么 知乎 编辑:程序博客网 时间:2024/05/17 04:42

写在前面

整个项目就是实现C#客户端往消息队列生产10W条消息,Ajax Web读取这10W条消息,后台采用Tomcat。


项目搭建环境:
  1. jdk1.7.0_04
  2. MyEclipse10.6
  3. apache-activemq-5.14.0-bin.zip
  4. Apache.NMS.ActiveMQ-1.7.2-bin.zip
  5. VS2013

后台搭建,Ajax Web读取消息实现可见上篇文章点击打开链接,本项目在此基础上。


C#客户端实现

VS2013新建一个C#控制台应用程序,项目中添加两个dll引用,一个是D:\Apache.NMS.ActiveMQ-1.7.2-bin\lib\Apache.NMS\net-4.0目录下的Apache.NMS.dll,另一个是D:\Apache.NMS.ActiveMQ-1.7.2-bin\build\net-4.0\debug目录下的Apache.NMS.ActiveMQ.dll。项目中加入

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Apache.NMS;using Apache.NMS.ActiveMQ;//发布订阅模式,一个生产者多个消费者namespace NmsProducer2{    class Program    {        static void Main(string[] args)        {            try            {                //Create the Connection Factory                  IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616/"); //这里可以写tcp://192.168.1.111:61616的形式连接其他服务器上的ActiveMQ服务器                 using (IConnection connection = factory.CreateConnection())                {                    //Create the Session                      using (ISession session = connection.CreateSession())                    {                        //Create the Producer for the topic/queue                          IMessageProducer prod = session.CreateProducer(                            new Apache.NMS.ActiveMQ.Commands.ActiveMQTopic("SecondTopic"));                        //Send Messages                          int i = 100000;                        //while (!Console.KeyAvailable)                        while(i>0)                        {                            ITextMessage msg = prod.CreateTextMessage();                            msg.Text = "msg" + i.ToString();                            Console.WriteLine("Sending: " + i.ToString());                            prod.Send(msg, Apache.NMS.MsgDeliveryMode.NonPersistent, Apache.NMS.MsgPriority.Normal, TimeSpan.MinValue);                            //System.Threading.Thread.Sleep(1000);                            i--;                        }                    }                }                Console.ReadLine();            }            catch (System.Exception e)            {                Console.WriteLine("{0}", e.Message);                Console.ReadLine();            }          }    }}


测试

首先,启动ActiveMQ消息队列,其次,再启动后台web工程,然后运行C#客户端往消息队列生产10W条消息,浏览器输入http://localhost:8161/admin/topics.jsp 选择“Topics” 查看消息队列,



浏览器输入http://localhost:8080/mqajax/,开始从消息队列中取消息




写在最后


相比与上篇文章介绍,web后台的index.html做了一些改动,具体代码如下

<!DOCTYPE html><html><head><meta charset="UTF-8"><title></title><script type="text/javascript" src="js/jquery-1.4.2.min.js"></script><script type="text/javascript" src="js/amq_jquery_adapter.js"></script><script type="text/javascript" src="js/amq.js"></script><script type="text/javascript">    var amq = org.activemq.Amq;    amq.init({      uri: 'amq',  //AjaxServlet所配置对应的URL      logging: true,//激活日志记录      timeout: 2,  //保持连接时长,单位为秒       clientId:(new Date()).getTime().toString() //防止多个浏览器窗口标签共享同一个JSESSIONID, 有这一句打开多个tab就是多个connection     });        //接收消息    var myHandler = function(message){          $("#msgDiv").append(message);          $("#msgDiv").append("<br>");          //$("#msgDiv").append(message.getAttribute('name')+":"+message.getAttribute('msg'));          //$("#msgDiv").append("<br>");      }    //此处只能使用topic,使用"channel:MY.NAME"无法实现从QUEUES取消息,具体原因还没找到    amq.addListener("anynameid","topic://SecondTopic",myHandler);   //"topic://MY.NAME" or "channel://MY.NAME"    //amq.addListener("channel","topic://SecondQueue",myHandler);/*//发送消息    function send(){        var nickname = $("#nickname").val();        var content = $("#content").val();        //var msg = nickname + " : " +content;        //amq.sendMessage("topic://SecondTopic","<message>"+msg+"</message>");  //Message是任意格式化好的XML或者被编码为XML内容的纯文本        amq.sendMessage("topic://SecondTopic", "<message name='" + nickname + "' msg='" + content + "'/>");      }    */</script></head><body><b>多人聊天室</b><hr><div style="height:300px;width:600px;border:block;overflow:auto" id="msgDiv"></div>昵称:<input type="text" id="nickname">内容:<input type="text" id="content"><button onclick="send()">发送</button></body></html>




完整项目下载

producer
consumer

参考

http://activemq.apache.org/nms/index.html
http://blog.csdn.net/peterpan_hai/article/details/52230911



问题

目前ajax前台只能只用topic,无法使用“channel:MY.NAME”从QUEUES取消息,具体原因还没找到,请知道的朋友不吝指出,非常感谢!

解决问题


上个问题原因已发现,因为客户端插入消息设置了selector,所以web端amq.addListener()也要设置相应的selector才能收到消息。

0 0