原文链接:

Active MQ C#实现

内容概要

主要以源码的形式介绍如何用C#实现同Active MQ 的通讯。本文假设你已经正确安装JDK1.6.x,了解Active MQ并有一定的编程基础。

正文

JMS 程序的最终目的是生产和消费的消息能被其他程序使用,JMS 的 Message 是一个既简单又不乏灵活性的基本格式,允许创建不同平台上符合非JMS 程序格式的消息。

Message 由消息头,属性和消息体三部份组成。

Active MQ支持过滤机制,即生产者可以设置消息的属性(Properties),该属性与消费者端的Selector对应,只有消费者设置的selector与消息的Properties匹配,消息才会发给该消费者。Topic和Queue都支持Selector。

示例代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes; using Apache.NMS;
using System.Diagnostics;
using Apache.NMS.Util;
using System.Windows.Threading; /*
* 功能描述:C#使用ActiveMQ示例
* 修改次数:2
* 最后更新: by Kagula,2012-07-31
*
* 前提条件:
* [1]apache-activemq-5.4.2
* [2]Apache.NMS.ActiveMQ-1.5.6-bin
* [3]WinXP SP3
* [4]VS2008 SP1
* [5]WPF工程 With .NET Framework 3.5
*
* 启动
*
* 不带安全控制方式启动
* [你的解压路径]\apache-activemq-5.4.2\bin\activemq.bat
*
* 安全方式启动
* 添加环境变量: ACTIVEMQ_ENCRYPTION_PASSWORD=activemq
* [你的解压路径]\apache-activemq-5.4.2\bin>activemq xbean:file:../conf/activemq-security.xml
*
* Active MQ 管理地址
* http://127.0.0.1:8161/admin/
* 添加访问"http://127.0.0.1:8161/admin/"的限制
*
* 第一步:添加访问限制
* 修改D:\apache\apache-activemq-5.4.2\conf\jetty.xml文件
* 下面这行编码,原
* <property name="authenticate" value="true" />
* 修改为
* <property name="authenticate" value="false" />
*
* 第二步:修改登录用户名密码,缺省分别为admin,admin
* D:\apache\apache-activemq-5.4.2\conf\jetty-realm.properties
*
* 用户管理(前提:以安全方式启动ActiveMQ)
*
* 在[你的解压路径]\apache-activemq-5.4.2\conf\credentials.properties文件中修改默认的用户名密码
* 在[你的解压路径]\apache-activemq-5.4.2\conf\activemq-security.xml文件中可以添加新的用户名
* e.g. 添加oa用户,密码同用户名。
* <authenticationUser username="oa" password="oa" groups="users,admins"/>
*
* 在[你的解压路径]\apache-activemq-5.4.2\conf\activemq-security.xml文件中你还可以设置指定的Topic或Queue
* 只能被哪些用户组read 或 write。
*
*
* 配置C# with WPF项目
* 项目的[Application]->[TargetFramework]属性设置为[.NETFramework 3.5](这是VS2008WPF工程的默认设置)
* 添加[你的解压路径]\Apache.NMS.ActiveMQ-1.5.6-bin\lib\Apache.NMS\net-3.5\Apache.NMS.dll的引用
* Apache.NMS.dll相当于接口
*
* 如果是以Debug方式调试
* 把[你的解压路径]\Apache.NMS.ActiveMQ-1.5.6-bin\build\net-3.5\debug\目录下的
* Apache.NMS.ActiveMQ.dll文件复制到你项目的Debug目录下
* Apache.NMS.ActiveMQ.dll相当于实现
*
* 如果是以Release方式调试
* 参考上文,去取Apache.NMS,Release目录下相应的DLL文件,并复制到你项目的Release目录下。
*
*
* 参考资料
* [1]《C#调用ActiveMQ官方示例》 http://activemq.apache.org/nms/examples.html
* [2]《ActiveMQ NMS下载地址》http://activemq.apache.org/nms/activemq-downloads.html
* [3]《Active MQ在C#中的应用》http://www.cnblogs.com/guthing/archive/2010/06/17/1759333.html
* [4]《NMS API Reference》http://activemq.apache.org/nms/nms-api.html
*/ namespace testActiveMQSubscriber
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
private static IConnectionFactory connFac; private static IConnection connection;
private static ISession session;
private static IDestination destination;
private static IMessageProducer producer;
private static IMessageConsumer consumer; protected static ITextMessage message = null; public Window1()
{
InitializeComponent(); initAMQ("MyFirstTopic");
} private void initAMQ(String strTopicName)
{
try
{
connFac = new NMSConnectionFactory(new Uri("activemq:failover:(tcp://localhost:61616)")); //新建连接
//connection = connFac.CreateConnection("oa","oa");//设置连接要用的用户名、密码 //如果你要持久“订阅”,则需要设置ClientId,这样程序运行当中被停止,恢复运行时,能拿到没接收到的消息!
connection.ClientId = "testing listener";
connection = connFac.CreateConnection();//如果你是缺省方式启动Active MQ服务,则不需填用户名、密码 //创建Session
session = connection.CreateSession(); //发布/订阅模式,适合一对多的情况
destination = SessionUtil.GetDestination(session, "topic://" + strTopicName); //新建生产者对象
producer = session.CreateProducer(destination);
producer.DeliveryMode = MsgDeliveryMode.NonPersistent;//ActiveMQ服务器停止工作后,消息不再保留 //新建消费者对象:普通“订阅”模式
//consumer = session.CreateConsumer(destination);//不需要持久“订阅” //新建消费者对象:持久"订阅"模式:
// 持久“订阅”后,如果你的程序被停止工作后,恢复运行,
//从第一次持久订阅开始,没收到的消息还可以继续收
consumer = session.CreateDurableConsumer(
session.GetTopic(strTopicName)
, connection.ClientId, null, false); //设置消息接收事件
consumer.Listener += new MessageListener(OnMessage); //启动来自Active MQ的消息侦听
connection.Start();
}
catch (Exception e)
{
//初始化ActiveMQ连接失败,往VS2008的Output窗口写入出错信息!
Debug.WriteLine(e.Message);
}
} private void SendMsg2Topic_Click(object sender, RoutedEventArgs e)
{
//发送消息
ITextMessage request = session.CreateTextMessage(DateTime.Now.ToLocalTime()+" "+tbMsg.Text);
producer.Send(request);
} protected void OnMessage(IMessage receivedMsg)
{
//接收消息
message = receivedMsg as ITextMessage; //UI线程,显示收到的消息
Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() =>
{
DateTime dt = new DateTime();
ListBoxItem lbi = new ListBoxItem();
lbi.Content = DateTime.Now.ToLocalTime() + " " + message.Text; lbR.Items.Add(lbi);
}));
}
}
}

队列通讯方式,消费者例子

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Apache.NMS;
using System.Diagnostics;
using log4net;
using Apache.NMS.Util;
using System.Collections; namespace Cat8637AutoCallServer
{
public class SMTask
{
public String Callee { get; set; }
public String CheckNumber { get; set; }
public int Deadline { get; set; } public override String ToString()
{
return String.Format("Callee={0},CheckNumber={1},Deadline={2}",
Callee,CheckNumber,Deadline);
}
} /*
* 负责接收任务,并把任务放在任务等待队列中。
*/
public class MQClient
{
private static readonly ILog logger = LogManager.GetLogger(typeof(MQClient)); private static IConnection connection = null;
private static ISession session = null; Queue _voiceSMTasks = new Queue(); public MQClient()
{
try
{
IConnectionFactory factory = new NMSConnectionFactory(new Uri("activemq:failover:(tcp://localhost:61616)")); //新建连接
//connection = connFac.CreateConnection("oa","oa");//设置连接要用的用户名、密码
connection = factory.CreateConnection(); session = connection.CreateSession();
IMessageConsumer consumer = session.CreateConsumer(session.GetQueue("TaskIssue_VoiceSM"));
consumer.Listener += new MessageListener(OnMessage); connection.Start();
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
} protected void OnMessage(IMessage receivedMsg)
{
IMessage message = receivedMsg as ITextMessage; SMTask smTask = new SMTask();
smTask.Callee = message.Properties["Callee"] as String;
smTask.CheckNumber = message.Properties["Message"] as String;
smTask.Deadline = Convert.ToInt32(message.Properties["deadline"] as String); logger.Info("Received: "+smTask.ToString()); lock (_voiceSMTasks)
{
_voiceSMTasks.Enqueue(smTask);
}
} public SMTask GetVoiceSMTask()
{
SMTask result = null;
lock (_voiceSMTasks)
{
if (_voiceSMTasks.Count > )
{
result = _voiceSMTasks.Dequeue() as SMTask;
}
}
return result;
}
}
}

队列通讯方式,生产者例子

        private void Send_Click(object sender, RoutedEventArgs e)
{
try
{
IDestination destination = SessionUtil.GetDestination(session, "queue://TaskIssue_VoiceSM"); //新建生产者对象
IMessageProducer producer = session.CreateProducer(destination);
producer.DeliveryMode = MsgDeliveryMode.NonPersistent;//ActiveMQ服务器停止工作后,消息不再保留 ITextMessage request = session.CreateTextMessage();
request.NMSCorrelationID = "TestVoiceSM";//这里我填了应用程序的名称。 request.Properties["Callee"] = tbCallee.Text;
request.Properties["Message"] = tbCheckNumber.Text;
request.Properties["deadline"] = tbValidDuration.Text; producer.Send(request); }
catch (Exception ex)
{
//初始化ActiveMQ连接失败,往VS2008的Output窗口写入出错信息!
Debug.WriteLine(ex.Message);
}
} private void Window_Closed(object sender, EventArgs e)
{
try
{
if (session == null)
return;
//if (connection == null)
// return; session.Close();
//connection.Close();
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}

Active MQ C#实现的更多相关文章

  1. 使用Active MQ在.net和java系统之间通信

    ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现 一.特性列表 ⒈ 多种语言和 ...

  2. JMS 之 Active MQ 启动嵌入式Broke

    一.如何启动active MQ 服务 (一).使用命令启动 /bin 目录下 ./activemq start 默认使用conf/activemq.xml 配置文件 b.[root@localhost ...

  3. java 通过jmx获取active mq队列消息

    一.修改active mq配置文件 修改\conf\activemq.xml,带下划线部分 <!-- Licensed to the Apache Software Foundation (AS ...

  4. Active MQ的初步探索

    参考链接: http://blog.csdn.net/jiuqiyuliang/article/details/46701559 JMS是jee规范,active MQ是该规范的实现 Active M ...

  5. JMS 之 Active MQ 的消息传输

    本文使用Active MQ5.6 一.消息协商器(Message Broker) broke:消息的交换器,就是对消息进行管理的容器.ActiveMQ 可以创建多个 Broker,客户端与Active ...

  6. Active MQ C++实现通讯记录

    Active MQ  C++实现通讯 背景知识: ActiveMQ是一个易于使用的消息中间件. 消息中间件 我们简单的介绍一下消息中间件,对它有一个基本认识就好,消息中间件(MOM:Message O ...

  7. 使用active mq

    1 windows下使用active mq 1.1 下载active mq 1.2 点击根目录\bin\win64\activemq.bat运行 1.3 登陆查看 http://localhost:8 ...

  8. 初探active mq

    mq(message queue),即消息队列,目前比较流行消息队列是active mq 和kafka.本文介绍如何简单的使用active mq. ActiveMQ官网下载地址:http://acti ...

  9. springMVC下集成active MQ发送邮件

    环境:本地需安装activemq,且访问正常,安装方法网上很多,这里省略. 1.添加相关jar包,我这里使用的是maven,你也可以选择其他方式添加.下面是maven相关配置: <!-- Act ...

随机推荐

  1. 用Java实现 ,冒泡排序与普通排序的区别

     冒泡排序与普通排序的区别  /**    *个人网址: http://www.lipengfei2013.tk    * 功能:冒泡排序与普通排序的区别    */ package www.csdn ...

  2. ListView 行高设置不起作用

    通常我们在自定义listview的时候会遇到这个问题,我们设置了每行的layout的高度,但是没起作用,那是因为在adapter里面getview的时候出的问题,通常我们写: view = mInfl ...

  3. JavaScipt实现倒计时方法总结

    JavaScript中提供了两种实现计时.延时的方法,分别如下: 一. t = setTimeout(“function()", millisecond) 与 clearTimeout(t) ...

  4. php 求水仙花数优化

    水仙花数是指一个n位数(n>=3),它每一个位上数字的n次幂之和等于它本身,n为它的位数.(比如:1^3+5^3+3^3 = 153) 水仙花数又称阿姆斯特朗数. 三位的水仙花数有4个:153, ...

  5. 联想S720/S720i通刷刷机包 Vibe V1.0

    ROM介绍 基于官方最新S116底包制作,保证足够的稳定性. 增加VIBE元素,看起来更加大气.美观. 首次增加VIBE元素,720i执行起来无压力,720可能会有点卡.自行酌情刷入. 有bug请文明 ...

  6. linux 之进程间通信-------------InterProcess Communication

    进程间通信至少可以通过传送打开文件来实现,不同的进程通过一个或多个文件来传递信息,事实上,在很多应用系统里,都使用了这种方法.但一般说来,进程间 通信(IPC:InterProcess Communi ...

  7. 网络编程——TCP连接

    TCP在双方传输数据前,发送方先请求建立连接,接收方同意建立连接后才能传输数据.(打电话:先拨号,等对方同意接听后,才能交流)...高可靠性 UDP不需要建立连接(发短信).不可靠,可能出现数据丢失等 ...

  8. highcharts图表组件入门教程:如何监听柱状图柱子点击事件动态更新当前数据点数值和所对应X轴刻度

    highcharts图表组件入门教程:如何监听柱状图柱子点击事件动态更新当前数据点数值和所对应X轴刻度 作者:highcharts | 时间:2014-6-11 14:07:05 | [小  大] | ...

  9. tomcat 会话超时设置

    1.为单个WEB设置SESSION 在WEB.XML中添加 xml 代码 <session-config> <session-timeout>15</session-ti ...

  10. 12个高矮不同的人,排成两排(catalan数)

    问题描述: 12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? 这个笔试题,很YD,因为把某个递归关系隐藏得很深. 问题分析: 我们先把这12个 ...