• 基于C#的IBM消息队列操作客户端


    背景:

    做XX项目需要把交易的消息推送给YY系统,技术选型MQ

    另:选用MQ原因是为了防止YY系统宕机,无法接受收消息

    实现

    1、安装IBM WebSphere MQ客户端

    2、引用amqmdnet.dll(在客户端的安装目录下可以找到)

    3、C#代码如下

      1 /*
      2  * write by:wjf
      3  * date:2015-05-20
      4  * dec:MQ操作客户端
      5  * 
      6  */
      7 using System;
      8 using System.Diagnostics;
      9 using System.IO;
     10 using IBM.WMQ;
     11 
     12 namespace RsaTest
     13 {
     14     public class IbmMQClient : IDisposable
     15     {
     16         // 定义MQ 服务器的IP 地址;
     17         private string hostname = "182.180.80.241";
     18         //private const string hostname = "182.180.80.243";
     19         //MQ侦听端口号
     20         //private const int port = 54221;
     21         private readonly int port;
     22         // 设置队列打开选项为可存放;
     23         private const int openOptions = MQC.MQOO_OUTPUT; // MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;
     24 
     25         // 队列管理器;
     26         private readonly MQQueueManager qManager;
     27         //队列名称
     28         private readonly string qName;
     29         // 定义MQ 服务器连接通道的名称;
     30         private readonly string channel;
     31         // 定义队列管理器的名称;
     32         //private string qManagerName;
     33 
     34         public IbmMQClient(string qManagerName, string channel, string qName, string sPort, string hostname)
     35         {
     36             //this.qManagerName = qManagerName;
     37             this.channel = channel;
     38             this.qName = qName;
     39             this.port = Convert.ToInt32(sPort);
     40             this.hostname = hostname;
     41             InitQueueEnv();
     42             qManager = new MQQueueManager(qManagerName);
     43         }
     44 
     45         /// <summary>
     46         /// 初始化队列环境
     47         /// </summary>
     48         private void InitQueueEnv()
     49         {
     50             // 初始化MQ 环境变量,以指定MQ 服务器的连接参数;
     51             // 指定MQ 服务器的主机名称;
     52             MQEnvironment.Hostname = hostname;
     53             // 指定MQ 服务器的服务器连接通道的名称;
     54             MQEnvironment.Channel = channel;
     55             // 指定MQ 服务器的侦听器的侦听端口号;
     56             MQEnvironment.Port = port;            
     57             //MQEnvironment.UserId = "mqm";            
     58         }
     59 
     60         public void SendMessage(string message)
     61         {
     62             if (qManager == null)
     63             {
     64                 throw new Exception("队列管理器未初始化。");
     65             }
     66             // 获得队列的访问句柄;
     67             MQQueue lq = qManager.AccessQueue(qName, openOptions);
     68 
     69             try
     70             {
     71                 // 构造新的消息对象,为发送消息做准备;
     72                 MQMessage mo = new MQMessage();
     73                 //指定编码(有点小重要哦)
     74                 mo.CharacterSet = 1208;
     75                 // 填入消息内容;
     76                 //mo.WriteUTF(message);
     77                 mo.WriteString(message);
     78                 //指定消息的格式
     79                 mo.Format = MQC.MQFMT_STRING;
     80                 // 构造放入消息选项对象;
     81                 MQPutMessageOptions pmo = new MQPutMessageOptions();
     82                 // 向已打开队列放入已构造的测试消息;
     83                 lq.Put(mo, pmo);
     84             }
     85             finally
     86             {
     87                 try
     88                 {
     89                     // 关闭本地队列;
     90                     lq.Close();
     91                 }
     92                 catch (Exception e)
     93                 {
     94                     Debug.WriteLine(e);
     95                 }
     96             }
     97         }
     98 
     99         public void SendFile(string filePath)
    100         {
    101             if (qManager == null)
    102             {
    103                 throw new Exception("队列管理器未初始化。");
    104             }
    105             // 获得队列的访问句柄;
    106             MQQueue lq = qManager.AccessQueue(qName, openOptions);
    107 
    108             try
    109             {
    110                 // 构造新的消息对象,为发送消息做准备;
    111                 MQMessage mo = new MQMessage();
    112                 //构建文件信息对象
    113                 FileInfo fi = new FileInfo(filePath);
    114                 //写入文件大小
    115                 mo.WriteInt8(fi.Length);
    116                 //写入文件名
    117                 mo.WriteUTF(fi.Name);
    118                 //写入文件内容
    119                 mo.Write(File.ReadAllBytes(filePath));
    120                 // 构造放入消息选项对象;
    121                 MQPutMessageOptions pmo = new MQPutMessageOptions();
    122                 // 向已打开队列放入已构造的测试消息;
    123                 lq.Put(mo, pmo);
    124             }
    125             finally
    126             {
    127                 try
    128                 {
    129                     // 关闭本地队列;
    130                     lq.Close();
    131                 }
    132                 catch (Exception e)
    133                 {
    134                     Debug.WriteLine(e);
    135                 }
    136             }
    137         }
    138 
    139         ~IbmMQClient()
    140         {
    141             Close();
    142         }
    143 
    144         /// <summary>
    145         /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
    146         /// </summary>
    147         /// <filterpriority>2</filterpriority>
    148         public void Dispose()
    149         {
    150             Close();
    151         }
    152 
    153         public void Close()
    154         {
    155             if (qManager != null)
    156             {
    157                 try
    158                 {
    159                     // 释放与队列管理器的连接;
    160                     qManager.Disconnect();
    161                 }
    162                 catch (Exception e)
    163                 {
    164                     Debug.WriteLine(e);
    165                 }
    166             }
    167         }
    168     }
    169 }

    后台兼职接单中,联系我微信:wjf88520

    by wujf

    mail:921252375@qq.com

  • 相关阅读:
    ZooKeeper基本原理
    ElasticSearch的基本原理与用法
    Solr与MySQL查询性能对比
    MySQL性能优化总结
    Java并发集合及线程池实现原理
    Java垃圾回收机制
    Java Spring的IoC和AOP的知识点速记
    基于Solr的空间搜索
    系统学习消息队列分享(十) 如何实现高性能的异步网络传输?
    系统学习消息队列分享(九) 如何使用异步设计提升系统性能?
  • 原文地址:https://www.cnblogs.com/wujf/p/4569005.html
Copyright © 2020-2023  润新知