C#实现同Active MQ通讯的方法

本文实例讲述了C#实现同Active MQ通讯的方法。分享给大家供大家参考,具体如下:

内容概要:

主要以源码的形式介绍如何用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.jb51.net/article/87956.htm
 * [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 > 0)
        {
          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);
  }
}

更多关于C#相关内容感兴趣的读者可查看本站专题:《C#窗体操作技巧汇总》、《C#常见控件用法教程》、《WinForm控件用法总结》、《C#程序设计之线程使用技巧总结》、《C#操作Excel技巧总结》、《C#中XML文件操作技巧汇总》、《C#数据结构与算法教程》、《C#数组操作技巧总结》及《C#面向对象程序设计入门教程》

希望本文所述对大家C#程序设计有所帮助。

(0)

相关推荐

  • 利用thrift实现js与C#通讯的实例代码

    1.为什么要用thrift js C#? 1.1 首先,js 通过 thrift 访问C#,实际上是一种c/s模式.thrift是通信工具,js是客户端,C#是服务端. 1.2 使用js直接与thrift server通信.让web开发变得更简单.如果使用Web Service,你需要自己去实现C/S两端的序列化与反序列化操作,还需要自行处理异常,降低了开发效率.而thrift则会自动生成两端的操作类,你只需要处理方法内部的逻辑即可. 1.3 js直接与thrift server通信,可以提高性

  • C#窗体间通讯的几种常用处理方法总结

    在进行C#应用程序开发的过程中,经常需要多窗体之间进行数据通信,本文举几个例子,把几种常用的通信方式总结一下,窗体界面如下图所示: 主窗体Form1是一个ListBox,单击选中某列时,弹出窗体Form2,Form2中两个控件,一个是TextBox,显示选中的该列的文本,另一个是按钮,点击时将修改后的值回传,且在Form1中修改相应的列的文本,同时Form2关闭. 方法一:传值 最先想到的,Form2构造函数中接收一个string类型参数,即Form1中选中行的文本,将Form2的TextBox

  • C#编写ActiveX网页截图控件

    故事背景:Java组的小伙伴需要一个能在IE(还是6...)下截图并返回给网页的功能,但是IE做起来很麻烦(可能根本做不到),于是找到我写一个ActiveX控件实现此功能,想着可能还有其他小伙伴需要这个功能,于是就PO出来,供需要的人使用,当然也可以作为学习C#编写ActiveX的一个简单入门教程(VC++效果更好). 功能截图如下: 代码分为两个核心部分:1.C#屏幕截图:2.C#开发ActivX控件.  1.屏幕截图,这个在网上找到了一个只需要5行代码的实现(超级精简),当然你也可以费点功夫

  • C#窗体间通讯处理的几种方法总结

    最近做项目遇到导出Excel的问题总结一下:看代码: 复制代码 代码如下: /// <summary>        /// 生成Excel的方法        /// </summary>        /// <param name="ds">DataSet</param>        /// <param name="url">Excel存在服务器的相对地址</param>       

  • C#用Activex实现Web客户端读取RFID功能的代码

    由于要在Web项目中采用RFID读取功能,所以有必要开发Activex,一般情况下开发Activex都采用VC,VB等,但对这两块不是很熟悉,所以采用C#编写Activex的方式实现. 本文方法参考网络 1.编写WindowsFromControls 2.发布WindowsFormControls为Activex 3.在web中使用该Activex 首先编写windows控件 如何编写不再详述(注意一个地方,GUID自己用vs工具生成一个,下面会用到.我的0CBD6597-3953-4B88-8

  • C#程序窗体间使用回调事件方式通讯示例

    Form2: 复制代码 代码如下: //定义一个需要string类型参数的委托         publicdelegate void MyDelegate(string text);         public partial class Form2 :Form1         {                //定义该委托的事件             public event MyDelegate MyEvent;             public Form2(string te

  • 一个进程间通讯同步的C#框架引荐

     0.背景简介 微软在 .NET 框架中提供了多种实用的线程同步手段,其中包括 monitor 类及 reader-writer锁.但跨进程的同步方法还是非常欠缺.另外,目前也没有方便的线程间及进程间传递消息的方法.例如C/S和SOA,又或者生产者/消费者模式中就常常需要传递消息.为此我编写了一个独立完整的框架,实现了跨线程和跨进程的同步和通讯.这框架内包含了信号量,信箱,内存映射文件,阻塞通道,及简单消息流控制器等组件.这篇文章里提到的类同属于一个开源的库项目(BSD许可),你可以从这里下载到

  • ActiveMQ在C#中的应用示例分析

    本文实例讲述了ActiveMQ在C#中的应用.分享给大家供大家参考,具体如下: ActiveMQ是个好东东,不必多说.ActiveMQ提供多种语言支持,如Java, C, C++, C#, Ruby, Perl, Python, PHP等.由于我在windows下开发GUI,比较关心C++和C#,其中C#的ActiveMQ很简单,Apache提供NMS(.Net Messaging Service)支持.Net开发,只需如下几个步骤即能建立简单的实现.C++的应用相对麻烦些,后面会有文章介绍.

  • 使用C#开发Socket通讯的方法

    下面的示例显示如何使用 Socket 类向 HTTP 服务器发送数据和接收响应. [C#]  public string DoSocketGet(string server)  {  //Sets up variables and a string to write to the server  Encoding ASCII = Encoding.ASCII;  string Get = "GET / HTTP/1.1\r\nHost: " + server +  "\r\n

  • C#实现同Active MQ通讯的方法

    本文实例讲述了C#实现同Active MQ通讯的方法.分享给大家供大家参考,具体如下: 内容概要: 主要以源码的形式介绍如何用C#实现同Active MQ 的通讯.本文假设你已经正确安装JDK1.6.x,了解Active MQ并有一定的编程基础. 正文: JMS 程序的最终目的是生产和消费的消息能被其他程序使用,JMS 的 Message 是一个既简单又不乏灵活性的基本格式,允许创建不同平台上符合非JMS 程序格式的消息. Message 由消息头,属性和消息体三部份组成. Active MQ支

  • JMS 之 Active MQ 的消息传输(详解)

    本文使用Active MQ5.6 一.消息协商器(Message Broker) broke:消息的交换器,就是对消息进行管理的容器.ActiveMQ 可以创建多个 Broker,客户端与ActiveMQ交互,实际上都是与ActiveMQ中的Broker交互,Broker配置在${MQ_HOME}\conf\activemq.xml. 二.连接器(Connectors)(一).传输连接器 (transportConnectors) transportConnectors 连接器:就是建立brok

  • Spring Boot基于Active MQ实现整合JMS

    我们使用jms一般是使用spring-jms和activemq相结合,通过spring Boot为我们配置好的JmsTemplate发送消息到指定的目的地Destination.本文以点到点消息模式为例,演示如何在Spring Boot中整合 JMS 和 Active MQ ,实现 MQ 消息的生产与消费. 点到点消息模式定义:当消息发送者发送消息,消息代理获得消息后,把消息放入一个队列里,当有消息接收者来接收消息的时候,消息将从队列里取出并且传递给接收者,这时候队列里就没有此消息了.队列Que

  • JAVA编程实现UDP网络通讯的方法示例

    本文实例讲述了JAVA编程实现UDP网络通讯的方法.分享给大家供大家参考,具体如下: UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议. 在OSI模型中,在第四层--传输层,处于IP协议的上一层.UDP有不提供数据包分组.组装和不能对数据包进行排序的缺点: 也就是说,当报文发送之后,是无法得知其是否安全完整到达的.UDP用来支持那些需要在计算机之间传输数据的网络应用. 采用UDP协议要先把数据定义成数据报(Datagram)并在数据报中指明数据所要达到

  • JAVA编程实现TCP网络通讯的方法示例

    本文实例讲述了JAVA编程实现TCP网络通讯的方法.分享给大家供大家参考,具体如下: TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议. 由IETF的RFC 793定义,在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能. 基于TCP网络通讯实现的类主要有服务器端的ServerSocket用客户端的Socket. 通讯流程: 打开服务器,等待客户端连接-->客户端连接上服务器-->数据通讯. 代码

  • PHP实现Soap通讯的方法

    本文实例讲述了PHP实现Soap通讯的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <?php function HttpSoap($server, $port, $url, $namespace, $action, $data) { $fp = @fsockopen($server, $port); if (!$fp) { return FALSE; } else { $soapData = ConstructData($namespace, $action, $dat

  • yii2中使用Active Record模式的方法

    本文实例讲述了yii2中使用Active Record模式的方法.分享给大家供大家参考,具体如下: 1. 在db.php中配置相应的数据库信息: return [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=yii2basic', 'username' => 'root', 'password' => '', 'charset' => 'utf8', ]; 2. 使用gii模块来自

  • Vue实现active点击切换方法

    循环的情况: 1.点击时传入index索引(获取当前点击的是哪个) @click="active(index)" 2.将索引值传入class(索引等于几就第几个添加active类) :class="{active:index==ins}" 3.在data里边添加ins:0(表示默认第一个添加active类) data{ ins:0 } 4.最后在methods里边添加方法 ctive (num) { this.ins=num } 非循环的情况: 1.在标签内写入点击

  • 在windows下使用python进行串口通讯的方法

    Windows版本下的python并没有内置串口通讯的pyserial的库,所以需要自己下载.参照了网上的教程,有许多用的pip的安装方式,但是试了几个都没有用,所以想到用GitHub下载库文件,步骤分为: 1.在Github下载python-serial的库 https://github.com/pyserial/pyserial 2.下载完成后解压压缩包,找到serial文件夹,并找到python的安装位置(右击IDLE,然后查看python安装位置).我的地址为:C:\Users\NI Y

  • JS实现iframe中子父页面跨域通讯的方法分析

    本文实例讲述了JS实现iframe中子父页面跨域通讯的方法.分享给大家供大家参考,具体如下: 在非跨域的情况下,iframe中的子父页面可以很方便的通讯,但是在跨域的情况下,只能通过window.postMessage()方法来向其他页面发送信息,其他页面要通过window.addEventListener()监听事件来接收信息: #跨域发送信息 #window.postMessage()语法 otherWindow.postMessage(message, targetOrigin, [tra

随机推荐