消息队列之ActiveMQ学习笔记(二、C#实例实现)
ActiveMQ提供多种语言支持,如Java, C, C++, C#, Ruby, Perl, Python, PHP等。此处列举C#实例
下述C#实例代是基于QUEUE的P2P方式,如需要实现TOPIC的广播模式,请参见下方总结第四条。
一 、发送端
public void ActiveSend()
{
IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616");
//通过工厂建立连接
using (IConnection connection = factory.CreateConnection())
{
try
{
//通过连接创建Session会话
using (ISession session = connection.CreateSession())
{
//通过会话创建生产者,方法里面new出来的是MQ中的Queue
using (IMessageProducer prod = session.CreateProducer(new Apache.NMS.ActiveMQ.Commands.ActiveMQQueue("firstQueue")))
{
//创建一个发送的消息对象
ITextMessage message = prod.CreateTextMessage();
while (true)
{
try
{
//给这个对象赋实际的消息
message.Text = Console.ReadLine();
//设置消息对象的属性,这个很重要哦,是Queue的过滤条件,也是P2P消息的唯一指定属性
message.Properties.SetString("filter", "demo");
//生产者把消息发送出去,几个枚举参数MsgDeliveryMode是否长链,MsgPriority消息优先级别,发送最小单位,当然还有其他重载
prod.Send(message, MsgDeliveryMode.NonPersistent, MsgPriority.Normal, TimeSpan.MinValue);
Console.WriteLine("消息发送成功");
}
catch (Exception ex)
{
Console.WriteLine("消息发送失败!" + ex);
}
} }
}
}
catch (Exception e)
{
Console.WriteLine("创建发送MQ失败失败" + e);
}
}
}
二 、接收端
public void ActiveReceived()
{
//创建连接工厂
IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616"); try
{
//通过工厂构建连接
using (IConnection connection = factory.CreateConnection())
{
//这个是连接的客户端名称标识
connection.ClientId = "firstQueueListener";
//启动连接,监听的话要主动启动连接
connection.Start();
//通过连接创建一个会话
using (ISession session = connection.CreateSession())
{
//通过会话创建一个消费者,这里就是Queue这种会话类型的监听参数设置
using (IMessageConsumer consumer = session.CreateConsumer(new Apache.NMS.ActiveMQ.Commands.ActiveMQQueue("firstQueue"), "filter='demo'"))
{
ITextMessage message;
while (true)
{
try
{
message = (ITextMessage)consumer.Receive();
Console.WriteLine("Receive msg:" + message.Text);
}
catch (Exception ex)
{
Console.WriteLine("接收消息失败!" + ex);
}
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine("启动接收失败!" + ex);
}
}
三 、总结
1.ActiveMQ 的队列类似于线程安全的队列,可以多个客户端(生产者)往该队列发送消息,但读取的客户端(消费者)只能有一个,即使同时开启多个消费者客户端(这种情况下每个消费者轮询接收消息)。
测试结果如下:

2.可以启动多个发送客户端,但需要注意的是只有在标识id不同的情况下才能开启多个消费者客户端,所以建议将消费者标识ID设置成唯一:
如:

connection.ClientId = "firstQueueListener" + Guid.NewGuid();
如果启动多个客户端但标识相同则会出现以下错误提示:

3.ActiveMQ支持过滤机制,即生产者可以设置消息的属性(Properties),该属性与消费者端的Selector对应,只有消费者设置的selector与消息的Properties匹配,消息才会发给该消费者。Topic和Queue都支持Selector。
4.上述C#实例是基于QUEUE的P2P方式,每条消息有且仅有一个消费者能接收。如需要广播,那么需要在创建生产者时将ActiveMQQueue对象修改为ActiveMQTopic对象,在此为了更直观再重新贴一边代码,不同处已标记
public void QueueReceived()
{
//创建连接工厂
IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616"); try
{
//通过工厂构建连接
using (IConnection connection = factory.CreateConnection())
{
//这个是连接的客户端名称标识
connection.ClientId = "firstQueueListener" + Guid.NewGuid();
//启动连接,监听的话要主动启动连接
connection.Start();
//通过连接创建一个会话
using (ISession session = connection.CreateSession())
{
//通过会话创建一个消费者,这里就是Topic这种会话类型的监听参数设置
using (IMessageConsumer consumer = session.CreateConsumer(new Apache.NMS.ActiveMQ.Commands.ActiveMQTopic("firstQueue"), "filter='demo'",false))
{
ITextMessage message;
while (true)
{
try
{
message = (ITextMessage)consumer.Receive();
Console.WriteLine("Receive msg:" + message.Text);
}
catch (Exception ex)
{
Console.WriteLine("接收消息失败!" + ex);
}
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine("启动接收失败!" + ex);
}
}
如下为测试结果:
5.测试结果可以去http://localhost:8161/admin查看,登陆用户密码默认均为admin

完整测试代码
https://pan.baidu.com/s/1NjKtg77cYTRbswxl5cO67A
消息队列之ActiveMQ学习笔记(二、C#实例实现)的更多相关文章
- 消息队列之ActiveMQ学习笔记(一、下载及安装)
1.访问官网地址 http://activemq.apache.org/ ,进入Download 2.选择最新版本 3.或者选择历史版本 4.下载解压后 5.然后再 bin目录下选择对应版本,双击 ...
- ActiveMQ学习笔记(二) JMS与Spring
上文可见,JMS Native API使用起来不是特别方便.好在Spring提供了很好的JMS支持. (一)配置ConnectionFactory 如果使用连接池的话,不要忘记activemq-poo ...
- ActiveMQ学习笔记(5)——使用Spring JMS收发消息
摘要 ActiveMQ学习笔记(四)http://my.oschina.net/xiaoxishan/blog/380446 中记录了如何使用原生的方式从ActiveMQ中收发消息.可以看出,每次 ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- JMX学习笔记(二)-Notification
Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...
- Linux内核学习笔记二——进程
Linux内核学习笔记二——进程 一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...
- muduo学习笔记(二)Reactor关键结构
目录 muduo学习笔记(二)Reactor关键结构 Reactor简述 什么是Reactor Reactor模型的优缺点 poll简述 poll使用样例 muduo Reactor关键结构 Chan ...
- 消息队列之rabbitmq学习使用
消息队列之rabbitmq学习使用 1.RabbitMQ简介 1.1.什么是RabbitMQ? RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,Rabb ...
- 工业物联网或系统集成中应用消息队列(ActiveMQ,C#的demo)的场景全面分析
1.[连载]<C#通讯(串口和网络)框架的设计与实现> 2.[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 2.应用SuperIO(SIO)和开源跨平台物联网框 ...
随机推荐
- windows7重置网卡命令
点击windows左下角菜单键,输入cmd 然后鼠标右键 cmd 以管理员身份运行,并输入命令 netsh winsock reset, 然后回车执行. 系统会提示要求重启计算机. 重启后即重置网卡成 ...
- gitlab-ce白名单设置杜绝并发数过大引起的封ip故障
gitlab-ce 7.9安装手札以及上篇文章的问题解决 鸣谢 感谢ruby大神===>章鱼的一路指点,才能拨开迷雾见云天! 章鱼大人: 国内Ansible部落原创翻译之一! 资深运维! ROR ...
- Vue -- element-ui FileSaver.js 导出
html <el-button type="danger" @click="exportRs">导出Excel报表</el-button> ...
- mysql init password centos
https://www.cnblogs.com/FlyingPuPu/p/7783735.html
- informix创建同义词
搜索词条 1.informix不同主机的数据库同义词创建? 2.informix怎么实现跨服务器数据抽取? 3.informix 数据库跨库访问的配置?https://blog.csdn.net/Da ...
- python自动华 (六)
Python自动化 [第六篇]:Python基础-面向对象 目录: 面向过程VS面向对象 面向对象编程介绍 为什么要用面向对象进行开发 面向对象的特性:封装.继承.多态 面向过程 VS 面向对象 ...
- Python--编码的疑惑
XML语法分析器在处理的时候,使用的是Unicode字符串,并且将其返回.Unicode可以处理特殊字符,但是如果将Unicode字符串转换为普通字符串,就会引发异常,比如Print, >> ...
- PHP mysqli_connect_errno() 函数
返回上一次连接错误的错误代码: <?php $con=mysqli_connect("localhost","wrong_user","my_p ...
- MongoDB 比较适用哪些业务场景
转载自:https://www.cnblogs.com/williamjie/p/10416294.html 在云栖社区上发起了一个 MongoDB 使用场景及运维管理问题交流探讨的技术话题,有近50 ...
- 023_统计当前 Linux 系统中可以登录计算机的账户有多少个
#!/bin/bash #方法 1: grep "bash$" /etc/passwd | wc -l #方法 2: #-F END都要大写! awk -F: '/bash$/{x ...