sangmin214
作者sangmin214·2011-04-13 12:22
系统工程师·SS

.net连接mq

字数 5512阅读 6519评论 4赞 1
最近貌似总能遇见同学用.net连接mq出现问题,虽然没做过什么mq开发,更别谈.net连接mq了,不过还是想整理一下,希望能给以后的初学者一点启发。
(1) 要学习.net连接MQ最重要的参考是ibm WebSphere MQ InfoCenter,里面有个教程<Using .NET>,详细介绍了使用.NET开发MQ应用的绝大多数细节
http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/index.jsp

(2) 以下内容大部分来自于《Using .NET》这本教程
#1 关于版本
由于MQ 7已经发布很久,MQ 6应该也差不多要走到它的尽头,所以使用.net开发MQ应用的话,推荐使用MQ7的client。因为MQ 7的客户端可以同时支持v6和v7,即使MQ服务器现在是v6,以后升级到v7,用.net开发的MQ应用也不需要做多大的改动。而且MQ 7在性能方面有很大的提升,而且对于.net还加入了对WCF的支持。

#2 连接方式
.net有3种方式连接MQ:
Client bindings connection
Server bindings connection
Managed client connection
第一种方式是MQ应用以客户端远程访问mq
第二种方式是MQ应用与MQ Server在同一个服务器上
第三种方式,我倒不是很清楚

#3 安装WebSphere MQ classes for .NET
在安装MQ之前,要先安装.net framework。如果是在安装MQ之后才安装.NET framework的话,需要重新注册一下这些模块(WMQInstallDirbinamqiRegisterdotNet.cmd)
在MQ server上,这些模块是默认安装的(包含在 Java and .NET Messaging and Web Services feature)
有些朋友懒得装MQ客户端,只是从其他的地方把相应的模块拷到自己的机器上(譬如amqmdnet.dll,amqmdxcs.dll for .NET),可能也能正常工作(由于我从事开发的经验比较少,具体不是很清楚),但非常推荐安装一下MQ客户端,因为它不仅包含了相关的类库和模块,还包含一下例子和示例代码,很值得初学者参考。
MQ客户端下载:http://www-01.ibm.com/support/docview.wss?rs=171&uid=swg24019253&loc=en_US&cs=utf-8&lang=en

#4 使用WebSphere MQ classes for .NET开发MQ应用
a. 配置MQ Server
在MQ服务器那边,启动qmgr,定义一个srvconn
DEF CHL('NET.CHANNEL') CHLTYPE(SVRCONN) TRPTYPE(TCP) MCAUSER(' ') + DESCR('Sample channel for WebSphere MQ classes for .NET')
注意这里的MCAUSER设置为了空值,其实这是一个安全隐患。更合理的做法是使用SSL或者security exit。
启动一个listener:
runmqlsr -t tcp [-m qmnqme] [-p portnum]
b. 测试小例子
安装MQ的时候顺便安装了一些例子,可以运行,来检验MQ的安装。譬如放消息,取消息的例子。
以后如果你自己开发的应用出了问题,可以运行一下这些小例子,并检查日志和错误,看看到底是哪些地方出了问题。

c. 排错
万一你的.NET应用程序出错,可以使用trace。相应的错误原因和代码也将非常有助于问题的解决。

d. 使用.NET开发MQ应用
接下来就是开发人员的活了,熟悉.NET开发MQ应用的接口和类库干活了。

下面转一个.NET连接MQ的小例子:(http://russsutton.com/developer/index.php/38/websphere-mq-net-connection-example/)
using System;
using IBM.WMQ; // Added reference to "C:Program FilesibmWebSphereMQbinamqmdnet.dll"
using System.Collections;

namespace TestWebsphereMQ
{    
    public class WMQTester
    {
        static void Main(string[] args)
        {            
            // Setup some test data
            string queueManagerName = "QM_TEST";
            string host = "127.0.0.1";
            int port = 1415;
            string channel = "QM_TEST.SVRCONN";

            WMQTester tester = new WMQTester();
            tester.Connect(queueManagerName, host, port, channel);
        }

        public MQQueueManager Connect(
               string queueManagerName, 
               string host, 
               int port, 
               string channel)
        {
            MQQueueManager queueManager; 

            // Setup connection information                  
            Hashtable queueProperties = new Hashtable();
            queueProperties[MQC.HOST_NAME_PROPERTY] = host;
            queueProperties[MQC.PORT_PROPERTY] = port;
            queueProperties[MQC.CHANNEL_PROPERTY] = channel;                                   

            try
            {             
                // Attempt the connection
                queueManager = new MQQueueManager(queueManagerName, queueProperties); 
                Console.WriteLine("Connected Successfully");
            }
            catch (MQException mexc)
            {
                // TODO: Setup other exception handling
                throw new Exception(mexc.Message
                           + " ReasonCode: " + mexc.ReasonCode
                           + "--- see list of Reason Codes at http://russsutton.com/developer/?p=45 "
                           + mexc.StackTrace, mexc);
            }

            // For now, return the queueManager to use in reading/writing messages next
            return queueManager;
        } 
    }
}

附注:
2011年4月11日 22:21 外面下着小雨
我把MQ7的Client装好,打开Visual Studio 2010,N久没用过这个东西了,建了个空项目,把上面的代码拷进去,启动虚拟机,改了些参数,然后运行,报错2035,赶紧去把MCAUSER改成mqm,然后运行,提示“Connected Successfully”,内心很爽。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论4 条评论


2011-04-19 17:10
感谢了!这么全面的整理
sangmin214sangmin214系统工程师SS
2011-04-19 15:28
既然你没有安装mq客户端,我就不能保证这个例子能正确运行了。
shijinbiaoshijinbiao软件开发工程师江苏润和软件
2011-04-18 13:54
你好,我没有装MQ客户端,只是从其他的地方把相应的模块拷到自己的机器上(譬如amqmdnet.dll,amqmdxcs.dll for .NET),出错,就是使用你上边的代码进行调试的,只是修改了一些本机的对列管理器名称等,错误信息如下:
at IBM.WMQ.MQBaseObject.throwNewMQException(Int32 compCode, Int32 reason)
   at IBM.WMQ.MQQueueManager.Connect(String queueManagerName)
   at IBM.WMQ.MQQueueManager..ctor(String queueManagerName, Hashtable properties)
艾依然艾依然其它惠牛农业
2011-04-13 13:40
期待!sangmin兄总是为大家着想!
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广