您当前的位置: 首页 » asp.net编程学习 » C#使用ACTICVEX控件MQAX200收发IBM WebSphere MQ 报文

C#使用ACTICVEX控件MQAX200收发IBM WebSphere MQ 报文

目前网上很多C#访问MQ的方法都是使用IBM的.net操作MQ类库,不错IBM WebSphere MQ 5.3升级到CSD05之后,提供了专门供.NET调用的类库,对在.NET环境下开发MQ通信程序起到很大促进作用,但是假如你的MQ系统还没有升级,或者由于某些兼容性的原因而暂时不能升级,那么就不能使用该方法和MQ进行正常通讯。
下面为大家讲解如何使用传统的ACTIVEX类库来进行MQ的通讯开发,MQSeries Automation Classes for ActiveX 是又一组允许程序员处理队列管理器对象的API。MQSeries Automation Classes for ActiveX 的组成部分为希望开发可在Windows 平台上运行的MQSeries 应用程序的设计人员和程序员们提供了可用的类。
1.外围设置工作:
为了完成开发工作,你需要在项目中引入MQAX200.dll 链接库,该链接库的位置在C:\Program Files\IBM\WebSphere MQ\bin文件夹下面,当然这取决于你机器的MQ安装路径。
其次,设置系统的环境变量:
MQSERVER=A_CHANNEL/TCP/10.101.180.11(1414)
MQCCSID=1381 MQ服务器使用的字符编码1381代表GBK、1208代表UTF(Coded Character Set Identifier:CCSID,IBM 又将 ISO8859-1 注册为 CCSID 819)
GMQ_MQ_LIB=C:\Program Files\IBM\WebSphere MQ\bin\mqic32.dll

2.为了日后开发方便,我将MQ的操作封装成了一个类IBMMQOP,该类提供了MQ的连接,收发功能,源码如下:
class IBMMQOP
{

private MQQueueManager MQ_QManager; //队列管理对象
private MQQueue MQ_SendQueue; //发送队列对象
private MQQueue MQ_ReceiveQueue; //接收队列对象
private MQSession MQ_Session; //会话对象
private MQMessage MQ_SendMessage; //发送消息对象
private MQMessage MQ_ReceiveMessage; //接收消息对象
private MQPutMessageOptions MQ_PutOptions; //发送消息设置选项
private MQGetMessageOptions MQ_GetOptions; //接收消息设置选项
public string QManageName; //对象管理器名称
public string RMQueueName; //远程队列名称
public string LOQueueName; //本地队列名称
public bool isConnect; //当前是否正在连接
private string errMsg; //错误信息

//------------------------------------------------------------------------
//构造函数初始化各个对象
public IBMMQOP()
{
MQ_QManager = new MQQueueManager(); //队列管理器对象
MQ_SendQueue = new MQQueue(); //发送队列对象
MQ_ReceiveQueue = new MQQueue(); //接收队列对象
MQ_Session = new MQSession(); //会话对象
QManageName = "QM_ABC"; //队列管理器名称
RMQueueName = "RE_QUEUE"; //发送队列名称
LOQueueName = "LOCAL"; //接收队列名称
isConnect = false;
}

public string ISO8859_GB2312(string msgText)
{
string xml;
xml = msgText;

//声明字符集
System.Text.Encoding iso8859, gb2312;
//iso8859
iso8859 = System.Text.Encoding.GetEncoding("iso8859-1");
//国标2312
gb2312 = System.Text.Encoding.GetEncoding("gb2312");
byte[] bt;
bt = iso8859.GetBytes(xml);
xml = gb2312.GetString(bt);
return xml;
}

public string GB2312_ISO8859(string msgText)
{
//声明字符集
System.Text.Encoding iso8859, gb2312;
//iso8859
iso8859 = System.Text.Encoding.GetEncoding("iso8859-1");
//国标2312
gb2312 = System.Text.Encoding.GetEncoding("gb2312");
byte[] gb;
gb = gb2312.GetBytes(msgText);
//返回转换后的字符
return iso8859.GetString(gb);
}


public string getErrMsg()
{
return errMsg;
}

public void clearErrs()
{
this.errMsg = "";
}

//-----------------------------------------------------------------------
//连接MQ服务器
public bool connect()
{


try
{
MQ_Session.ClearErrorCodes();
MQ_QManager = (MQQueueManager)MQ_Session.AccessQueueManager(QManageName); //设置队列管理器名称
MQ_QManager.Connect(); //连接MQ服务器
if (MQ_QManager.IsOpen && MQ_QManager.IsConnected) //如果队列管理器是打开的状态并且是连接状态返回真
{
isConnect = true;
return true;
}
else
{
isConnect = false;
this.errMsg = "连接MQ错误:" + QManageName + "连接不成功!";
return false;
}
}
catch (Exception oe)
{
isConnect = false;
this.errMsg = "连接MQ错误:" + oe.StackTrace + oe.Message;
return false;
}
}

//-------------------------------------------------------------------------------
//准备发送
public bool prepareToSend()
{
if (!this.isConnect) return false;
try
{
MQ_SendQueue = (MQQueue)MQ_QManager.AccessQueue(RMQueueName, (int)(MQ.MQOO_OUTPUT), QManageName, "", "");
MQ_SendMessage = (MQMessage)MQ_Session.AccessMessage();
MQ_PutOptions = (MQPutMessageOptions)MQ_Session.AccessPutMessageOptions();
MQ_PutOptions.Options = (int)(MQ.MQPMO_NO_SYNCPOINT);
return true;
}
catch (Exception oe)
{
this.errMsg = "准备发送信息到MQ错误:" + oe.StackTrace + oe.Message;
return false;
}
}

//-------------------------------------------------------------------------------
//发送消息
public bool sendMsg(string msg)
{
try
{
MQ_SendQueue.ClearErrorCodes();
MQ_SendMessage.MessageData = msg;
MQ_SendQueue.Put(MQ_SendMessage, MQ_PutOptions);
if (MQ_SendQueue.CompletionCode == 0) return true;
this.errMsg = "准备发送信息到MQ错误:结果返回码错误!";
return false;
}
catch (Exception oe)
{
this.errMsg = "发送信息到MQ错误:" + oe.StackTrace + oe.Message;
return false;
}
}
//-------------------------------------------------------------------------------
//准备接收
public bool prepareToReceive()
{
if (!this.isConnect) return false;
try
{
MQ_ReceiveQueue = (MQQueue)MQ_QManager.AccessQueue(this.LOQueueName, (int)(MQ.MQOO_INPUT_SHARED), "", "", "");
MQ_ReceiveMessage = (MQMessage)MQ_Session.AccessMessage();
MQ_ReceiveMessage.CharacterSet = 819;
MQ_GetOptions = (MQGetMessageOptions)MQ_Session.AccessGetMessageOptions();
MQ_GetOptions.Options = MQ_GetOptions.Options + (int)(MQ.MQPMO_NO_SYNCPOINT);
return true;
}
catch (Exception oe)
{
this.errMsg = "准备接收信息MQ错误:" + oe.StackTrace + oe.Message;
return false;
}
}
//-------------------------------------------------------------------------------
//接收消息
public bool receiveMsg(ref string msg)
{
try
{
MQ_ReceiveQueue.ClearErrorCodes();
MQ_ReceiveQueue.Get(MQ_ReceiveMessage, MQ_GetOptions, System.Reflection.Missing.Value);
if (MQ_ReceiveQueue.CompletionCode == 0)
{
msg = MQ_ReceiveMessage.MessageData.ToString();
return true;
}
this.errMsg = "接收信息MQ错误:返回码错误!";
return false;
}
catch (Exception oe)
{
//if (oe.Message.Contains("MQRC_NO_MSG_AVAILABLE")) return true;
this.errMsg = "接收信息MQ错误:" + oe.StackTrace + oe.Message;
return false;
}
}
//-------------------------------------------------------------------------------
//关闭MQ操作
public bool disconnect()
{
if (!this.isConnect) return true;
MQ_QManager.Disconnect();
return true;
}
}
3.如何使用该类进行发送:
IBMMQOP oIBMMQOP = new IBMMQOP();
oIBMMQOP.LOQueueName = "接收队列名称";
oIBMMQOP.QManageName = "队列管理器名称";
oIBMMQOP.RMQueueName = "发送队列名称";
oIBMMQOP.connect();
oIBMMQOP.prepareToSend();
oIBMMQOP.sendMsg("this is a test!!!");
oIBMMQOP.disconnect();
4.如何使用该类进行接收:
IBMMQOP oIBMMQOP = new IBMMQOP();
oIBMMQOP.LOQueueName = "接收队列名称";
oIBMMQOP.QManageName = "队列管理器名称";
oIBMMQOP.RMQueueName = "发送队列名称";
oIBMMQOP.connect();
oIBMMQOP.prepareToReceive();
string tmpStr = "";
oIBMMQOP.receiveMsg(ref tmpStr);
oIBMMQOP.disconnect();
5.常见错误处理:
一般出现的错误都与MQ管理器名称不正确,IP地址设置不正确,MQCCSID设置和服务器上的设置不一致,以及忘记设置GMQ_MQ_LIB=C:\Program Files\IBM\WebSphere MQ\bin\mqic32.dll有关,请核对上述环境变量名称。
如果提示连接权限问题,可以在MQ服务器上对服务器连接通道进行设置,选择其中的MCA,将administrator填写进去即可(如图),当然这取决于你使用什么账户运行的你的C#程序,如果C#程序和MQ服务器在一台机器上,往往不会遇到权限问题。

上一篇:没有文章了
留下脚印压缩包密码:sosuo8
名字:
全部评论:
loading...
申明:本站部分文章来自网络,由于各种原因对文章的来源无从考究,如果您是“ C#使用ACTICVEX控件MQAX200收发IBM WebSphere MQ 报文 ”的原作者,若侵犯您的版权,请与我联系!联系方法:email:ahuinan@21cn.com  QQ:106494262
文章档案
  • 作者:佚名
  • 来源:转载
  • 日期:2015/12/4 10:20:00
  • 点击:loading...
网友投票(您觉得这篇文章怎样?)
loadding...请稍侯......