您的位置:首页 > 编程语言 > C#

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>


完整项目下载

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才能收到消息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息