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. C#开发windows服务如何调试——资料整理

    原文标题:C# Windows服务程序如何进行调试 原文地址:https://jingyan.baidu.com/article/456c463b18e1b00a583144b3.html 第一种: ...

  2. synchronized 和 Lock 有什么区别?(未完成)

    synchronized 和 Lock 有什么区别?(未完成)

  3. Unknown initial character set index '255' received from server. Initial client character 解决方法

    Unknown initial character set index '255' received from server. Initial client character set can be ...

  4. vue 标题上下滚屏 无缝轮播

    参考网址:https://www.jianshu.com/p/b6813193ca0d <template> <div class="wrap" :style=& ...

  5. Lua 学习之基础篇二<Lua 数据类型以及函数库 汇总>

    引言 前面讲了运算符,这里主要对Lua的数据处理相关的数据类型和函数库进行总结归纳,后面会再接着单独分开讲解具体使用. 首先因为Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值. 值可以存储 ...

  6. C#上传下载文件

    方法一.通过Ajax方式上传文件(input file),使用FormData进行Ajax请求 <div  > <input type="file" name=& ...

  7. php基本语法形式

    站长新闻: 备注:目前有很多人通过李书记博客找到我,请教各种关于问题,而我这段时间是比较忙的,有时候真的是有心无力,网站更新也少了,希望大家见谅!还有很多phper希望我找下关于php相关的技术文档我 ...

  8. BZOJ 2229 / Luogu P3329 [ZJOI2011]最小割 (分治最小割板题)

    题面 求所有点对的最小割中<=c的数量 分析 分治最小割板题 首先,注意这样一个事实:如果(X,Y)是某个s1-t1最小割,(Z,W)是某个s2-t2最小割,那么X∩Z.X∩W.Y∩Z.Y∩W这 ...

  9. springAop Schedule,注解annotation 实现任务监控

    我们有很多定时任务在任务工程中执行,但是如果我们不加以监控,很有可能定时任务死掉或者卡住我们都不知道. 所以需要做一个任务监控.监控任务当前执行的状态. 还是那样,先让定时任务启动起来,当前我们使用的 ...

  10. .net常用属性

    1.   在ASP.NET中专用属性:               获取服务器电脑名:Page.Server.ManchineName               获取用户信息:Page.User   ...