这个例子是我在做公司的中间件项目时写的,用于测试。希望能和开发MQ消息中间件得朋友们一起分享。
IBM WebSphere MQ 消息队列得基础请参考前面写的一些文章。现在我将向大家介绍下我写的这个例子:
开发工具:Visual Studio 2008
开发语言:c#
1.添加引用。要开发MQ 消息队列项目,必须先添加如下引用
using IBM.WMQ;
安装好IBM MQ 消息队列资源管理器,就会在你安装目录下找到IBM文件夹,我们要做的是找到amqmdnet.dll 文件,并将它以引用的形式添加到解决方案中。
注意:这并不够,你还必须手动添加两个dll文件到解决方案的bin/debug 文件夹中。这两个dll文件是amqzsaic.dll、imqc23vn.dll。这样我们就可以开发MQ得程序了,这是我自己的个人总结,如有不妥请见谅,但是,我会把我知道的以及我的体会都写在这里,好了,废话少说。
2.收发类的介绍,我把代码贴在这里,若有疑问请给我留言。
using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IBM.WMQ;
using System.Xml;
using System.Configuration;
using System.Windows.Forms;
namespace WindowsFormsApplicationMQ
{
class Management
{
string queueName;
MQQueueManager qMgr;
MQMessage mqMsg;
MQQueue queue;
MQPutMessageOptions putOptions;
#region 连接队列管理器
///
/// **************************************************************************************************************
/// 这部分主要的功能是连接队列管理器,而连接队列管理器之前必须要设置的环境变量主要包括:
/// 连接的主机的IP地址HostName、通道名称Channel和端口Port此外还要有指定的队列管理器名以及队
/// 列的名称.HostName,Channel,Port,QueueName,QueueManager在配置文件App.config中指定.
/// **************************************************************************************************************
///
public Management()
{
}
string linkStatus;
public string LinkToQueueManager()
{
try
{
//从配置文件中读取值
string HostName = ConfigurationSettings.AppSettings["HostName"];
string Channel = ConfigurationSettings.AppSettings["Channel"];
int Port = Convert.ToInt32(ConfigurationSettings.AppSettings["Port"]);
string QueueName = ConfigurationSettings.AppSettings["Queue"];
MQEnvironment.Hostname = HostName;
MQEnvironment.Channel = Channel;
MQEnvironment.Port = Port;
queueName = QueueName;
qMgr = new MQQueueManager("DOCK"); //连接队列管理器
linkStatus = "连接队列管理器:" + HostName + "成功!";
}
catch (MQException e)
{
linkStatus ="连接队列管理器错误: 结束码:"+e.CompletionCode+" 错误原因代码:"+e.ReasonCode;
}
return linkStatus;
}
#endregion
#region 发送消息
///
/// *********************************************************************************************
///
/// 发送消息,这里的功能是发送Xml文档,条件是必须传入文档所在的位置信息
///
/// *********************************************************************************************
///
///
public void SendMsg(string message)
{
int openOptions=MQC.MQOO_OUTPUT | MQC.MQOO_INPUT_SHARED | MQC.MQOO_INQUIRE;
try
{
queue = qMgr.AccessQueue(queueName, openOptions); //尝试打开队列
}
catch(MQException e)
{
MessageBox.Show("打开队列失败:"+e.Message .ToString ());
}
///以Xml文档的方式发送
///System.Xml.XmlDocument document = new System.Xml.XmlDocument();
///document.Load(filepath);
mqMsg = new MQMessage();
mqMsg.WriteString(message );
putOptions = new MQPutMessageOptions();
try
{
queue.Put(mqMsg, putOptions); //将消息放入消息队列
}
catch (MQException mqe)
{
MessageBox.Show("发送异常终止:"+mqe .Message );
}
}
#endregion
#region 接收消息
///
/// *********************************************************************************************
///
/// 从队列管理器中接收消息,并转存在DataSet中
///
/// *********************************************************************************************
///
///
public DataSet receiveMsg()
{
int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_INPUT_SHARED | MQC.MQOO_INQUIRE;
try
{
queue = qMgr.AccessQueue(queueName, openOptions); //尝试打开队列
}
catch (MQException e)
{
MessageBox.Show("打开队列失败:" + e.Message.ToString());
}
//从队列管理器中获得消息
MQGetMessageOptions mqGetMsgOpts;
mqMsg = new MQMessage();
mqGetMsgOpts = new MQGetMessageOptions();
mqGetMsgOpts.WaitInterval = 15000;
mqGetMsgOpts.Options |= MQC.MQGMO_WAIT;
try
{
int i = queue.CurrentDepth;
if (i > 0)
{
queue.Get(mqMsg, mqGetMsgOpts); //获得消息
}
else
{
return null;
}
}
catch(MQException ex) {
throw new Exception("访问队列停止"+ex.InnerException .ToString ());
}
//if (queue.CurrentDepth == 0)
//{
// return null;
//}
DataSet ds = new DataSet();
DataTable table = new DataTable("t_user");
table.Columns.Add("UserID", typeof(int));
table.Columns.Add("UserName", typeof(string));
table.Columns.Add("Password", typeof(string));
//table.Columns.Add("ShowOrder", typeof(int));
//table.Columns.Add("Remark", typeof(string));
table.Columns.Add("city", typeof(string));
table.Columns.Add("state", typeof(string));
table.Columns.Add("zip", typeof(string));
table.Columns.Add("contract", typeof(string));
ds.Tables.Add(table);
string message = mqMsg.ReadString(mqMsg.MessageLength);
mqMsg.Format = MQC.MQFMT_XMIT_Q_HEADER;
System.IO.StringReader reader = new System.IO.StringReader(message );
ds.ReadXml(reader,XmlReadMode.Fragment);
return ds;
}
#endregion
}
}