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. JavaScript004,输出

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. Cannot modify resource set without a write transaction 问题

    TransactionalEditingDomainImpl editingDomain = (TransactionalEditingDomainImpl) diagramEditor.getEdi ...

  3. spring boot项目接入xxl-job

    关于分布式任务调度平台XXL-JOB,作者 许雪里 在其发布的中文教程中已经介绍的很清楚了,这里就不做过多的介绍了.按照文档搭建xxl-job,做此纪录. 1.源码下载地址 GitHub:https: ...

  4. sql server 复习笔记2

    主键约束 可以通过定义primary key 约束来定义主键, 用于强制表的实体化完整性,一个表只能有一个主键约束, 并且primary key 约束中的列不能为空值,由于primary key 约束 ...

  5. Activiti服务类- HistoryService服务类

    转自:https://www.cnblogs.com/liuqing576598117/p/11164027.html 一共个方法15个方法 用于查询历史工作流信息1.创建查询(7个方法)//创建一个 ...

  6. 使List<userClass>.Contains可以查找重復的對象

    List.Contains实现对比 http://blog.csdn.net/yswucn/article/details/4091469

  7. OSI七层协议模型

    OSI七层模型详解 TCP/IP协议 链接:https://www.nowcoder.com/questionTerminal/b2ccf60bbb13483b94b4bffe200b4f3c 来源: ...

  8. Codeforces 1243 D 0-1 MST

    题面 隐隐感觉N年前做过一道类似的题. 很显然我们只需要考虑,仅有0边的子图有多少个连通块,然后这个数量减去1就是答案了(这个和kruscal过程等价). 然后其实就是妥妥的暴力了...因为1边数量非 ...

  9. 【概率论】1-4:事件的的并集(Union of Events and Statical Swindles)

    title: [概率论]1-4:事件的的并集(Union of Events and Statical Swindles) categories: Mathematic Probability key ...

  10. slax中改变终端字体

    修改~/.Xresources文件 ! English font      Xterm*faceName: DejaVu Sans Mono=True:size=16 修改颜色: ! colos XT ...