背景:

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

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

实现

1、安装IBM WebSphere MQ客户端

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

3、C#代码如下

 /*
* write by:wjf
* date:2015-05-20
* dec:MQ操作客户端
*
*/
using System;
using System.Diagnostics;
using System.IO;
using IBM.WMQ; namespace RsaTest
{
public class IbmMQClient : IDisposable
{
// 定义MQ 服务器的IP 地址;
private string hostname = "182.180.80.241";
//private const string hostname = "182.180.80.243";
//MQ侦听端口号
//private const int port = 54221;
private readonly int port;
// 设置队列打开选项为可存放;
private const int openOptions = MQC.MQOO_OUTPUT; // MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT; // 队列管理器;
private readonly MQQueueManager qManager;
//队列名称
private readonly string qName;
// 定义MQ 服务器连接通道的名称;
private readonly string channel;
// 定义队列管理器的名称;
//private string qManagerName; public IbmMQClient(string qManagerName, string channel, string qName, string sPort, string hostname)
{
//this.qManagerName = qManagerName;
this.channel = channel;
this.qName = qName;
this.port = Convert.ToInt32(sPort);
this.hostname = hostname;
InitQueueEnv();
qManager = new MQQueueManager(qManagerName);
} /// <summary>
/// 初始化队列环境
/// </summary>
private void InitQueueEnv()
{
// 初始化MQ 环境变量,以指定MQ 服务器的连接参数;
// 指定MQ 服务器的主机名称;
MQEnvironment.Hostname = hostname;
// 指定MQ 服务器的服务器连接通道的名称;
MQEnvironment.Channel = channel;
// 指定MQ 服务器的侦听器的侦听端口号;
MQEnvironment.Port = port;
//MQEnvironment.UserId = "mqm";
} public void SendMessage(string message)
{
if (qManager == null)
{
throw new Exception("队列管理器未初始化。");
}
// 获得队列的访问句柄;
MQQueue lq = qManager.AccessQueue(qName, openOptions); try
{
// 构造新的消息对象,为发送消息做准备;
MQMessage mo = new MQMessage();
//指定编码(有点小重要哦)
mo.CharacterSet = ;
// 填入消息内容;
//mo.WriteUTF(message);
mo.WriteString(message);
//指定消息的格式
mo.Format = MQC.MQFMT_STRING;
// 构造放入消息选项对象;
MQPutMessageOptions pmo = new MQPutMessageOptions();
// 向已打开队列放入已构造的测试消息;
lq.Put(mo, pmo);
}
finally
{
try
{
// 关闭本地队列;
lq.Close();
}
catch (Exception e)
{
Debug.WriteLine(e);
}
}
} public void SendFile(string filePath)
{
if (qManager == null)
{
throw new Exception("队列管理器未初始化。");
}
// 获得队列的访问句柄;
MQQueue lq = qManager.AccessQueue(qName, openOptions); try
{
// 构造新的消息对象,为发送消息做准备;
MQMessage mo = new MQMessage();
//构建文件信息对象
FileInfo fi = new FileInfo(filePath);
//写入文件大小
mo.WriteInt8(fi.Length);
//写入文件名
mo.WriteUTF(fi.Name);
//写入文件内容
mo.Write(File.ReadAllBytes(filePath));
// 构造放入消息选项对象;
MQPutMessageOptions pmo = new MQPutMessageOptions();
// 向已打开队列放入已构造的测试消息;
lq.Put(mo, pmo);
}
finally
{
try
{
// 关闭本地队列;
lq.Close();
}
catch (Exception e)
{
Debug.WriteLine(e);
}
}
} ~IbmMQClient()
{
Close();
} /// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
/// <filterpriority></filterpriority>
public void Dispose()
{
Close();
} public void Close()
{
if (qManager != null)
{
try
{
// 释放与队列管理器的连接;
qManager.Disconnect();
}
catch (Exception e)
{
Debug.WriteLine(e);
}
}
}
}
}

基于C#的IBM消息队列操作客户端的更多相关文章

  1. .NET Core微服务之基于EasyNetQ使用RabbitMQ消息队列

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.消息队列与RabbitMQ 1.1 消息队列 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更 ...

  2. Delayer 基于 Redis 的延迟消息队列中间件

    Delayer 基于 Redis 的延迟消息队列中间件,采用 Golang 开发,支持 PHP.Golang 等多种语言客户端. 参考 有赞延迟队列设计 中的部分设计,优化后实现. 项目链接:http ...

  3. linux消息队列操作

    对消息队列的操作无非有以下三种类型: 1. 打开或创建消息队列消息队列的内核持续性要求每一个消息队列都在系统范围内相应唯一的键值,所以,要获得一个消息队列的描写叙述字,仅仅需提供该消息队列的键值就可以 ...

  4. 滴滴出行基于RocketMQ构建企业级消息队列服务的实践

    小结: 1. https://mp.weixin.qq.com/s/v6NM3UgX-qTI7yO1QPCJrw 滴滴出行基于RocketMQ构建企业级消息队列服务的实践 原创: 江海挺 阿里巴巴中间 ...

  5. [转载] 基于Redis实现分布式消息队列

    转载自http://www.linuxidc.com/Linux/2015-05/117661.htm 1.为什么需要消息队列?当系统中出现“生产“和“消费“的速度或稳定性等因素不一致的时候,就需要消 ...

  6. 基于redis的延迟消息队列设计

    需求背景 用户下订单成功之后隔20分钟给用户发送上门服务通知短信 订单完成一个小时之后通知用户对上门服务进行评价 业务执行失败之后隔10分钟重试一次 类似的场景比较多 简单的处理方式就是使用定时任务 ...

  7. 基于redis的延迟消息队列设计(转)

    需求背景 用户下订单成功之后隔20分钟给用户发送上门服务通知短信 订单完成一个小时之后通知用户对上门服务进行评价 业务执行失败之后隔10分钟重试一次 类似的场景比较多 简单的处理方式就是使用定时任务 ...

  8. 基于线程池、消息队列和epoll模型实现并发服务器架构

    引言 并发是什么?企业在进行产品开发过程中为什么需要考虑这个问题?想象一下天猫的双11和京东的618活动,一秒的点击量就有几十万甚至上百万,这么多请求一下子涌入到服务器,服务器需要对这么多的请求逐个进 ...

  9. 基于Docker搭建分布式消息队列Kafka

    本文基于Docker搭建一套单节点的Kafka消息队列,Kafka依赖Zookeeper为其管理集群信息,虽然本例不涉及集群,但是该有的组件都还是会有,典型的kafka分布式架构如下图所示.本例搭建的 ...

随机推荐

  1. N个数的数组求N-1个数组合乘积最大的一组

    /* 编程之美题,给定N个数的数组,只能使用乘法,不使用除法,找出N-1个数的乘积最大的一组,有两种方法,方法一:采用两个数组分别保存从左向右 和从又向左的两个乘积值,然后在扫描一次,求出最大乘积,空 ...

  2. 动态链接库DLL

    函数和数据被编译进一个二进制文件(通常扩展名为.LIB). 静态库: 在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文 ...

  3. mysql 一个较特殊的问题:You can't specify target table for update in FROM clause

    mysql 一个较特殊的问题:You can't specify target table for update in FROM clause 即:不能先select出同一表中的某些值,再update ...

  4. Spring笔记之(一)初探

    对spring框架的学习我是从模拟它的简单实现开始,这样也易于领悟到它的整个框架结构,以下是简单实现的代码: 配置文件:spring.xml <?xml version="1.0&qu ...

  5. HW5.18

    public class Solution { public static void main(String[] args) { System.out.printf("%s\t%s\n&qu ...

  6. Python模块导入及使用经验回顾 [ 持续更新 ]

    1,若需要导入的模块并不是一个简单的*.py文件,而是在Lib目录下的一个文件夹,则要注意检查这个文件夹下有无__init__.py文件(该文件虽然经常为空,但是缺失该文件,对模块的导入有很大的影响) ...

  7. Linux 常见文件打包压缩命令

    .tar 解包: tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!)       参数说明:         - ...

  8. mongoDB中的连接池(转载)

    一.mongoDB中的连接池 刚上手MongoDB,在做应用时,受以前使用关系型数据库的影响,会考虑数据库连接池的问题! 关系型数据库中,我们做连接池无非就是事先建立好N个连接(connection) ...

  9. 【转】在rman增量备份中,有差异增量和累积增量的概念

    本文转自hougoo的博客 1.概念 差异增量:是备份上级及同级备份以来所有变化的数据块,差异增量是默认增量备份方式 累积增量:是备份上级备份以来所有变化的块 因为累积增量是备份上级备份以来所有变化的 ...

  10. ros和Android(一)

    ros和Android :first-child { margin-top: 0; } blockquote > :last-child { margin-bottom: 0; } img { ...