IBM.WMQ订阅消息
网上关于IBM这个消息队列中间件的资料相对比较少,C#相关的资料就更少了,最近因为要对接这个队列中间件,花了不少功夫去搜索、整理各种资料,遇到很多问题,因此记录下来。
1、基于 amqmdnet.dll 进行开发,这个是官方提供的DLL,安装了IBM WebSphere MQ后在安装目录可以找到(C:\Program Files\IBM\WebSphere MQ\bin)
2、基于 MmqiNetLite.dll 开发,这是一个开源组件,地址:https://github.com/fglaeser/mmqinet,这个项目代码有部分未完善,原作者也是好几年没更新,但是基础功能可以使用,本文代码主要基于此编写
源码如下:
public class IBMWMQConfig
{
/// <summary>
/// MQ主机地址
/// </summary>
private const string CONNECTION_HOST = "";
/// <summary>
/// 通讯端口
/// </summary>
private const int CONNECTION_PORT = ;
/// <summary>
/// CLIENT_ID
/// </summary>
private const string CLIENT_ID = "";
/// <summary>
/// 通道名称
/// </summary>
public const string CHANNEL = "SYSTEM.ADMIN.SVRCONN";
/// <summary>
/// 队列管理器名称
/// </summary>
public const string QUEUE_MGR_NAME = "PHIBHUBGW1";
/// <summary>
/// 订阅主题持久化标识,{0}标识具体业务
/// </summary>
public static readonly string SUBSCRIPTION_TEMPLATE = "JMS:" + QUEUE_MGR_NAME + ":" + CLIENT_ID + "_{0}.REQ:{0}.REQ";
/// <summary>
/// 主题名称模板,{0}标识具体业务
/// </summary>
public static readonly string TOPIC_TEMPLATE = "{0}.REQ";
/// <summary>
/// IBM.WMQ连接字符串
/// </summary>
public static readonly string CONNECTION_INFO = string.Format("{0}({1})", CONNECTION_HOST, CONNECTION_PORT);
}
订阅消息:
/// <summary>
/// 订阅主题
/// </summary>
/// <param name="business"></param>
/// <returns></returns>
private string SubTopic(string business)
{
string message = string.Empty;
try
{
using (var mqmgr = MQQueueManager.Connect(IBMWMQConfig.QUEUE_MGR_NAME, MQC.MQCO_NONE, IBMWMQConfig.CHANNEL, IBMWMQConfig.CONNECTION_INFO))
{
MQSubscription subs = new MQSubscription(mqmgr);
if (mqmgr.IsConnected)
{
int option = MQC.MQSO_CREATE + MQC.MQSO_RESUME + MQC.MQSO_NON_DURABLE + MQC.MQSO_MANAGED + MQC.MQSO_FAIL_IF_QUIESCING;
string subName = string.Format(IBMWMQConfig.SUBSCRIPTION_TEMPLATE, business);
string topicName = string.Format(IBMWMQConfig.TOPIC_TEMPLATE, business); subs.Subscribe(subName, option, topicName); MQMessage incoming = new MQMessage();
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.WaitInterval = * ;//MQC.MQWI_UNLIMITED;
gmo.Options |= MQC.MQGMO_WAIT;
gmo.Options |= MQC.MQGMO_SYNCPOINT; subs.Get(incoming, gmo);
message = incoming.ReadAll(); //subs.Close(MQC.MQCO_REMOVE_SUB, closeSubQueue: true, closeSubQueueOptions: MQC.MQCO_NONE);
}
}
}
catch (MQException e)
{
message = e.Reason.ToString();
}
return message;
}
向队列推送一条消息:
/// <summary>
/// 向消息队列推送一条消息
/// </summary>
/// <param name="msg">消息内容</param>
/// <param name="queueName">队列名称</param>
public void PushMsgToQueue(string msg, string queueName)
{
using (var mqmgr = MQQueueManager.Connect(IBMWMQConfig.QUEUE_MGR_NAME, MQC.MQCO_NONE, IBMWMQConfig.CHANNEL, IBMWMQConfig.CONNECTION_INFO))
using (var q = new MQQueue(mqmgr, queueName, MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING))
{
var outgoing = new MQMessage()
{
CharacterSet = MQC.CODESET_UTF,
Encoding = MQC.MQENC_NORMAL
};
outgoing.WriteString(msg);
q.Put(outgoing, new MQPutMessageOptions());
}
} /// <summary>
/// 向消息队列推送一条消息
/// </summary>
/// <param name="msg">消息内容</param>
/// <param name="queueName">队列名称</param>
public void PushMsgToQueue1(string msg, string queueName)
{
using (var mqmgr = MQQueueManager.Connect(IBMWMQConfig.QUEUE_MGR_NAME, MQC.MQCO_NONE, IBMWMQConfig.CHANNEL, IBMWMQConfig.CONNECTION_INFO))
{
if (mqmgr.IsConnected)
{
var outgoing = new MQMessage()
{
CharacterSet = MQC.CODESET_UTF,
Encoding = MQC.MQENC_NORMAL
};
outgoing.WriteString(msg); var od = new MQObjectDescriptor
{
ObjectType = MQC.MQOT_Q,
ObjectName = queueName
};
mqmgr.Put1(od, outgoing, new MQPutMessageOptions());
}
}
}
IBM.WMQ订阅消息的更多相关文章
- IBM.WMQ订阅主题,连续获取消息解决办法
去队列里面一直获取消息,一开始想到了两种解决方案: 第一:订阅一次获取一次消息,正常的话每次都能获取到,但是要及时去清理订阅并且时间粒度不好控制 第二:订阅一次,再获取消息这里加死循环,超时MQ已经做 ...
- Kafka是分布式发布-订阅消息系统
Kafka是分布式发布-订阅消息系统 https://www.biaodianfu.com/kafka.html Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apa ...
- 分布式发布订阅消息系统 Kafka 架构设计[转]
分布式发布订阅消息系统 Kafka 架构设计 转自:http://www.oschina.net/translate/kafka-design 我们为什么要搭建该系统 Kafka是一个消息系统,原本开 ...
- MQTT的学习研究(六) MQTT moquette 的 Blocking API 订阅消息客户端使用
* 使用 Java 为 MQ Telemetry Transport 创建订户 * 在此任务中,您将遵循教程来创建订户应用程序.订户将针对主题创建预订并接收该预订的发布. * 提供了一个示例订户应用程 ...
- JMS发布/订阅消息传送例子
前言 基于上篇文章"基于Tomcat + JNDI + ActiveMQ实现JMS的点对点消息传送"很容易就可以编写一个发布/订阅消息传送例子,相关环境准备与该篇文章基本类似,主要 ...
- 高吞吐量的分布式发布订阅消息系统Kafka--安装及测试
一.Kafka概述 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因 ...
- 分布式发布订阅消息系统Kafka
高吞吐量的分布式发布订阅消息系统Kafka--安装及测试 一.Kafka概述 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览, ...
- Kafka logo分布式发布订阅消息系统 Kafka
分布式发布订阅消息系统 Kafka kafka是一种高吞吐量的分布式发布订阅消息系统,她有如下特性: 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳 ...
- RBMQ发布和订阅消息
RBMQ发布和订阅消息 exchange 参考翻译自: RabbitMQ官网 生产者并非将消息直接发送到queue,而是发送到exchange中,具体将消息发送到特定的队列还是多个队列,或者是丢弃,取 ...
随机推荐
- SublimeCodeIntel 所有代码提示和补全插件 All Autocomplete 插件搜索所有打开的文件来寻找匹配的提示词
SublimeCodeIntelSublimeCodeIntel 作为一个代码提示和补全插件,支持 JavaScript.Mason.XBL.XUL.RHTML.SCSS.Python.HTML.Ru ...
- PHP基础语法之 位运算
写了几年PHP的人都好奇说,没有用过位运算符.所以,此处你看二进制看的头晕,就去T¥M¥D吧. 位运算符基本不用,我们也将这个知识设置为了解级别.位运算符的知识点,你不想学习也可以.等以后用到位运算的 ...
- IDEA2018创建SpringBoot无法连接https://start.spring.io
这是由于spring-boot需要访问https://start.spring.io外网,但是由于国内的局域网限制导致的. 解决办法: 进入到IDEA的setting 搜索 HTTP Proxy 选择 ...
- ckeditor粘贴word
); Server.setTimeout(_this.config.timeout, function(cli){ cli.end('timeout\n'); }); console.log('Ser ...
- linux系列(五):rm命令
rm是一个危险的命令,使用的时候要特别当心,尤其对于新手,否则整个系统就会毁在这个命令(比如在/(根目录)下执行rm * -rf).所以,我们在执行rm之前最好先确认一下在哪个目录,到底要删除什么东西 ...
- HDU 4609 3-idiots ——(FFT)
这是我接触的第一个关于FFT的题目,留个模板. 这题的题解见:http://www.cnblogs.com/kuangbin/archive/2013/07/24/3210565.html. FFT的 ...
- weui-wxss框架实现博远企信小程序
- Spring Boot :Failed to instantiate SLF4J LoggerFactory Reported exception:
Spring Boot出现以下错误: Failed to instantiate SLF4J LoggerFactory Reported exception: Failed to instantia ...
- springMVC_配置文件搭建基础环境
SpringMVC与Struts的区别. 一.基础jar包 二.①DispatcherServlet,handelMapping,webAction(colltroller),ModelAndView ...
- redis之为什么redis是单线程?
官方FAQ表示,因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽.既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的 ...