精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究。点名“简易百科”和闲暇巴盗用锐英源原创内容。
最近开发平台,需要进程间通信,在查资料时,发现了IBM Websphere MQ,网站平台是经常使用消息队列的场合,IBM Websphere MQ里的Web突出了此MQ的历史悠久和可靠性。IBM从硬件转向服务行业,在软件平台上没有建树,肯定不能面对市场要求,IBM Websphere MQ是IBM的重要产品之一,进程间协作通信是企业级平台必备的关键工具软件,也是IBM立足服务业的基石。
IBM Websphere MQ能够在Linux下使用,环境安装方便。
下面介绍IBM Websphere MQ的C#简单用法:
介绍
在 IBM Websphere MQ 应用程序中,通常我们需要处理合适的消息以立即到达队列。在这种情况下,轮询方法不是一个好的解决方案;等待消息或事件驱动是更好的解决方案。
IBM Websphere MQ 为到达队列的进程消息提供触发。实际上,MQ 的 Triggering 是很挑剔的。您必须创建初始队列、进程等。重要的是,您必须运行“runmqtrm”命令来监控您想要的队列上的 MQ 触发。
我针对这种情况提出了一个简单的解决方案。如果您知道消息何时到达队列,为什么不等待消息。
背景
在可以使用 WebSphere MQ 对象的属性、方法或事件之前,必须创建对该对象的引用。添加 WebSphere MQ 引用的技术是添加 amqmdnet.dll 作为引用。此动态链接库 (DLL) 通常位于:C:\Program Files\IBM\WebSphere MQ\bin\amqmdnet.dll 并使用 IBM.WMQ;
使用代码
MQMessageListener 类提供Listen 方法来等待到达队列管理器qmName 和队列queueName 的合适消息。
在 MQMessageListener 类中,MQQueueManager 设置打开选项是 MQOO_INPUT_AS_Q_DEF 和 MQOO_FAIL_IF_QUIESCING, 用于连接到 Websphere MQ 以使用 queue-define 获取消息,如果该队列处于静默模式则失败。然后 MQGetMessageOptions 设置为 MQGMO_FAIL_IF_QUIESCING 和 MQGMO_WAIT 用于 MQGMO_WAIT。当您将 WaitInterval 设置为 MQWI_UNLIMITED 时,此选项与 WaitInterval 方法一起使用,应用程序将在 queue.Get(message, gmo) 处等待消息到达队列。当消息到达队列时,应用程序将运行以返回消息。
public class MQMessageListener { public static MQMessage Listen(string qmName, string queueName) { /** MQOO_INPUT_AS_Q_DEF -- open queue to get message * using queue-define default. * MQOO_FAIL_IF_QUIESCING -- access fail if queue manager is quiescing. **/ int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_FAIL_IF_QUIESCING; MQQueueManager mqManager = new MQQueueManager(qmName); MQQueue queue = mqManager.AccessQueue(queueName,openOptions); /** MQGMO_FAIL_IF_QUIESCING -- * get message fail if queue manager is quiescing. * MQGMO_WAIT -- waits for suitable message to arrive. * MQWI_UNLIMITED -- unlimited wait interval. **/ MQGetMessageOptions gmo = new MQGetMessageOptions(); gmo.Options = MQC.MQGMO_FAIL_IF_QUIESCING | MQC.MQGMO_WAIT; gmo.WaitInterval = MQC.MQWI_UNLIMITED; MQMessage message = new MQMessage(); //wait for message queue.Get(message, gmo); queue.Close(); //release resource. mqManager = null; queue = null; gmo = null; System.GC.Collect(); return message; } } class Program
{
static void Main(string[] args)
{
Console.WriteLine("==START==");
String message = null;
do{
Console.WriteLine("Waiting...");
MQMessage mqMessage = MQMessageListener.Listen
("MANAGER.QUEUE", "LOCAL.QUEUE");
message = mqMessage.ReadString(mqMessage.MessageLength);
Console.WriteLine("\tMessage: " + message);
}while(message != "BYE");
Console.WriteLine("==END==");
}
}
注:socket编程里也有选项,也有listen,其实通信的过程上来看是类似的,但是环境不一样,环境有可能会导致复杂问题。