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. [Visual Studio] 自定义项目模板(.vsix扩展)

    VS自定义项目模板:[2]创建VSIX项目模板扩展 听语音 | 浏览:1237 | 更新:2015-01-02 09:21 | 标签:软件开发 1 2 3 4 5 6 7 分步阅读 一键约师傅 百度师 ...

  2. Selenium(六)对话框处理与登录测试

    1.以百度为例,找到登录框,查看元素,可以看到这是一个div 操作登录框: 通过判断是否找到这个错误提示元素查看是否登录成功. 一个简单的登录脚本:

  3. Selenium(一)自动化测试简介

    1.软件开发流程 产品分析需求--架构师确认系统包含哪些模块--开发编码--开发和测试一起做单元测试--测试开展版本(集成)测试(使用手工测试,测试通过后,才开始设计脚本)--测试开展系统测试--最后 ...

  4. linux实操_rpm包和yum包

    rpm包的简单查询指令: 查询已安装的rpm列表 rpm -qa | grep xxx 查询火狐浏览器 查询安装的rpm包软件的信息 查询rpm软件包的文件安装在哪里 查询文件属于哪个软件包 卸载rp ...

  5. Oracle自动化安装脚本-part03-亲试ok

     此为 软件包配置文件 software.conf [CentOS6] binutils-2.20.51.0.2-5.11.el6 (x86_64) compat-libcap1-1.10-1 (x8 ...

  6. Sql中partition by的使用

    partition by关键字是oracle中分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partition by用于给结果集分 ...

  7. HDU 6129 - Just do it | 2017 Multi-University Training Contest 7

    比赛时脑子一直想着按位卷积... 按题解的思路: /* HDU 6129 - Just do it [ 规律,组合数 ] | 2017 Multi-University Training Contes ...

  8. React中生命周期

    1.过时的生命周期(v16.3之前) 1.当前组件初次渲染: 绿色表示执行顺序. constructor(): 如果不需要初始化,可以直接省略,会自动补全该函数. 可以在这个方法中初始化this.st ...

  9. pyecharts v1 版本 学习笔记 柱状图

    柱状图 bar 基本演示例子 from pyecharts import options as opts from pyecharts.charts import Bar c =( Bar().add ...

  10. ckeditor不能粘贴word的问题如何解决

    自动导入Word图片,或者粘贴Word内容时自动上传所有的图片,并且最终保留Word样式,这应该是Web编辑器里面最基本的一个需求功能了.一般情况下我们将Word内容粘贴到Web编辑器(富文本编辑器) ...