最近貌似总能遇见同学用.net连接mq出现问题,虽然没做过什么mq开发,更别谈.net连接mq了,不过还是想整理一下,希望能给以后的初学者一点启发。
(1) 要学习.net连接MQ最重要的参考是ibm WebSphere MQ InfoCenter,里面有个教程<Using .NET>,详细介绍了使用.NET开发MQ应用的绝大多数细节
(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客户端,因为它不仅包含了相关的类库和模块,还包含一下例子和示例代码,很值得初学者参考。
#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应用的接口和类库干活了。
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”,内心很爽。
添加新评论4 条评论
2011-04-19 17:10
2011-04-19 15:28
2011-04-18 13:54
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