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#实例实现)的更多相关文章

  1. 消息队列之ActiveMQ学习笔记(一、下载及安装)

    1.访问官网地址  http://activemq.apache.org/  ,进入Download 2.选择最新版本 3.或者选择历史版本 4.下载解压后 5.然后再 bin目录下选择对应版本,双击 ...

  2. ActiveMQ学习笔记(二) JMS与Spring

    上文可见,JMS Native API使用起来不是特别方便.好在Spring提供了很好的JMS支持. (一)配置ConnectionFactory 如果使用连接池的话,不要忘记activemq-poo ...

  3. ActiveMQ学习笔记(5)——使用Spring JMS收发消息

      摘要 ActiveMQ学习笔记(四)http://my.oschina.net/xiaoxishan/blog/380446 中记录了如何使用原生的方式从ActiveMQ中收发消息.可以看出,每次 ...

  4. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  5. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

  6. Linux内核学习笔记二——进程

    Linux内核学习笔记二——进程   一 进程与线程 进程就是处于执行期的程序,包含了独立地址空间,多个执行线程等资源. 线程是进程中活动的对象,每个线程都拥有独立的程序计数器.进程栈和一组进程寄存器 ...

  7. muduo学习笔记(二)Reactor关键结构

    目录 muduo学习笔记(二)Reactor关键结构 Reactor简述 什么是Reactor Reactor模型的优缺点 poll简述 poll使用样例 muduo Reactor关键结构 Chan ...

  8. 消息队列之rabbitmq学习使用

    消息队列之rabbitmq学习使用 1.RabbitMQ简介 1.1.什么是RabbitMQ? RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,Rabb ...

  9. 工业物联网或系统集成中应用消息队列(ActiveMQ,C#的demo)的场景全面分析

    1.[连载]<C#通讯(串口和网络)框架的设计与实现> 2.[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 2.应用SuperIO(SIO)和开源跨平台物联网框 ...

随机推荐

  1. 读HTTP权威指南的体会

    国庆期间,我读了HTTP权威指南一书,现在我把总节为大家讲一下: Web 浏览器.服务器和相关的Web 应用程序都是通过HTTP 相互通信的.HTTP 是 现代全球因特网中使用的公共语言. 是对HTT ...

  2. mongodb的基本操作之更新不存在的数据

    查找y为100的数据 db.test_collection.find({y:100}) 发现没有,这时候将y为100的数据更新为y为999的数据 db.test_collection.update({ ...

  3. springboot中,使用redisTemplate操作redis

    知识点: springboot中整合redis springboot中redisTemplate的使用 redis存数据时,key出现乱码问题 一:springboot中整合redis (1)pom. ...

  4. SP703 SERVICE - Mobile Service[DP]

    题意翻译 Description 一个公司有三个移动服务员.如果某个地方有一个请求,某个员工必须赶到那个地方去(那个地方没有其他员工),某一时刻只有一个员工能移动.只有被请求后,他才能移动,不允许在同 ...

  5. C# 截图不失真

    Bitmap bmp = new Bitmap(@"E:\2222.jpg"); Bitmap bmp2 = bmp.Clone(new Rectangle(10 + 80, 15 ...

  6. SpringBoot启动过程原理(转)

    1.1 Springboot启动: @SpringBootApplication public class ServerApplication { public static void main(St ...

  7. js访问数据库

    一.js访问数据库的一般步骤: 1. 创建一个到数据库的 ADO 连接 conn = new ActiveXObject("ADODB.Connection"); 2. 打开数据库 ...

  8. CF70E Information Reform

    题意:给你一棵树,要选择若干节点,若一个点i没有选择,则有\(d(dis(i,j))\)的代价,其中j被选择.选择一个点代价为k,求最小代价. 首先,考虑这样一个问题: 如果距离a的最近被选点为i,距 ...

  9. 【深入学习Redis】Redis内存模型

    前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分. 我们使用Redis时,会接触Redis的5种对象类型(字符串 ...

  10. 泰乐事(Telos)白皮书中文版 <一> 泰乐事项目(未完成)

    泰乐事项目 一个可持续发展的去中心化EOSIO网络 EOS系统在设计上为人们带来了令人惊喜的一种实现新经济模式的承诺.然而很不幸,其高度中心化的运营正不断地破坏这种承诺.90%的EOS代币掌握在仅仅1 ...