ActiveMQ消息队列的应用 C#客户端 Web后端
2016-08-18 15:42
621 查看
写在前面
整个项目就是实现C#客户端往消息队列生产10W条消息,Ajax Web读取这10W条消息,后台采用Tomcat。项目搭建环境:
jdk1.7.0_04
MyEclipse10.6
apache-activemq-5.14.0-bin.zip
Apache.NMS.ActiveMQ-1.7.2-bin.zip
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>
完整项目下载
producerconsumer
参考
http://activemq.apache.org/nms/index.htmlhttp://blog.csdn.net/peterpan_hai/article/details/52230911
问题
目前ajax前台只能只用topic,无法使用“channel:MY.NAME”从QUEUES取消息,具体原因还没找到,请知道的朋友不吝指出,非常感谢!解决问题
上个问题原因已发现,因为客户端插入消息设置了selector,所以web端amq.addListener()也要设置相应的selector才能收到消息。相关文章推荐
- 工业物联网或系统集成中应用消息队列(ActiveMQ,C#的demo)的场景全面分析
- 工业物联网或系统集成中应用消息队列(ActiveMQ,C#的demo)的场景全面分析
- ActiveMQ消息中间件简明笔记(2)——队列模式和主题模式应用开发(JMS API)
- Web应用中的轻量级消息队列
- 消息队列入门(三)ActiveMQ的应用实例
- activemq消息队列的使用及应用docker部署常见问题及注意事项
- ActiveMQ消息队列的集群安装及应用(二)
- ActiveMQ消息队列的单机使用及应用(一)
- ActiveMQ消息队列的使用及应用
- ActiveMQ消息队列的使用及应用
- Web应用中的轻量级消息队列
- 消息队列入门(四)ActiveMQ的应用实例
- C#应用消息队列异步处理数据存储
- [置顶] spring boot 使用activeMQ实现消息队列简单应用
- web集群部署(实例大于等于2个),nginx作为中间件时候,后端websocket有时候消息无法传递给客户端
- ActiveMQ的最简单应用-队列消息
- ActiveMQ消息队列的使用及应用
- ActiveMQ消息队列的使用及应用
- C#编写Windows服务程序 (服务端),客户端使用 消息队列 实现淘宝 订单全链路效果
- ActiveMQ消息队列的使用及应用