基于C#的IBM消息队列操作客户端
背景:
做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消息队列操作客户端的更多相关文章
- .NET Core微服务之基于EasyNetQ使用RabbitMQ消息队列
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.消息队列与RabbitMQ 1.1 消息队列 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更 ...
- Delayer 基于 Redis 的延迟消息队列中间件
Delayer 基于 Redis 的延迟消息队列中间件,采用 Golang 开发,支持 PHP.Golang 等多种语言客户端. 参考 有赞延迟队列设计 中的部分设计,优化后实现. 项目链接:http ...
- linux消息队列操作
对消息队列的操作无非有以下三种类型: 1. 打开或创建消息队列消息队列的内核持续性要求每一个消息队列都在系统范围内相应唯一的键值,所以,要获得一个消息队列的描写叙述字,仅仅需提供该消息队列的键值就可以 ...
- 滴滴出行基于RocketMQ构建企业级消息队列服务的实践
小结: 1. https://mp.weixin.qq.com/s/v6NM3UgX-qTI7yO1QPCJrw 滴滴出行基于RocketMQ构建企业级消息队列服务的实践 原创: 江海挺 阿里巴巴中间 ...
- [转载] 基于Redis实现分布式消息队列
转载自http://www.linuxidc.com/Linux/2015-05/117661.htm 1.为什么需要消息队列?当系统中出现“生产“和“消费“的速度或稳定性等因素不一致的时候,就需要消 ...
- 基于redis的延迟消息队列设计
需求背景 用户下订单成功之后隔20分钟给用户发送上门服务通知短信 订单完成一个小时之后通知用户对上门服务进行评价 业务执行失败之后隔10分钟重试一次 类似的场景比较多 简单的处理方式就是使用定时任务 ...
- 基于redis的延迟消息队列设计(转)
需求背景 用户下订单成功之后隔20分钟给用户发送上门服务通知短信 订单完成一个小时之后通知用户对上门服务进行评价 业务执行失败之后隔10分钟重试一次 类似的场景比较多 简单的处理方式就是使用定时任务 ...
- 基于线程池、消息队列和epoll模型实现并发服务器架构
引言 并发是什么?企业在进行产品开发过程中为什么需要考虑这个问题?想象一下天猫的双11和京东的618活动,一秒的点击量就有几十万甚至上百万,这么多请求一下子涌入到服务器,服务器需要对这么多的请求逐个进 ...
- 基于Docker搭建分布式消息队列Kafka
本文基于Docker搭建一套单节点的Kafka消息队列,Kafka依赖Zookeeper为其管理集群信息,虽然本例不涉及集群,但是该有的组件都还是会有,典型的kafka分布式架构如下图所示.本例搭建的 ...
随机推荐
- [JSOI2008]星球大战
正向进行很显然很BT, 所以逆向离线此题是个不错的选择. 使用并查集统计劫难之后的联通状态, 然后逐个添加结点即可. #include <stdio.h> #include <std ...
- H.264 Profile、Level、Encoder三张简图 (fps = AVCodecContext->time_base.den / AVCodecContext->time_base.num)
H.264 Profiles Profiles are sets of capabilities. If your black box only supports the Baseline profi ...
- 最简单实现跨域的方法:用 Nginx 反向代理
本文作者: 伯乐在线 - 良少 .未经作者许可,禁止转载!欢迎加入伯乐在线 专栏作者. 什么是跨域 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对javascrip ...
- Windows Service中使用Threading.Timer需注意回收
在Windows Service中使用Threading.Timer时需要注意回收池问题 Threading.Timer是基于线程池的,系统会对其进行垃圾回收. 当Threading.Timer定义在 ...
- nslookup、arp、netstat、traceroute
nslookup 主要用于测试DNS服务器是否正常工作,除此之外,还可以对域名和IP地址进行查询. [root@weekend110 ~]# nslookup> www.guet.edu.cn ...
- mongodb的固定集合(优化效率)
mongodb固定集合(Capped Collection)和大文件管理(GridFS) Capped Collection 固定集合(Capped Collection)是性能出色的有着固定 ...
- iOS开发中使用静态库 .a 文件
iOS开发中,在使用一些第三方库时,可能是一个静态库(比如GPUImage).这种情况下,需要编译出静态库文件(.a) ,然后配合响应的头文件(.h 文件)使用. 编译静态库,直接在Xcode中编 ...
- vc++ CreateFile报错,返回123
//hFile = CreateFile("D:\dev\fmt\res\face1.png", 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, ...
- NoSQL 数据库产品学习总结(一)
NoSQL 数据库产品学习总结(一) 本篇文章共分为四个章节,会陆续整理下 Memcached.Redis.tair.mongodb.hbase.SequoiaDB. Cassandra的相关知识. ...
- 判断jsp中是否存在某个javascript函数
//判断父页是否存在某个javascript函数 function fnExist(fnName) { //return fnName in this && eval(fnName) ...