IBM WebShpere MQ 簡單介紹:
具體的詳細信息大家可以在IBM的網站和網上有許多的學習資料。
IBM MQ是實現了消息隊列的一箇中間件,它可以運行在現在所有流行的平臺上。在我們的項目中主要使用的是AS400和UNIX平臺上。
在IBM MQ中主要分爲以下幾個對象:
Queue Manager |
隊列管理器 |
主要負責管理隊列、通道等,類似與Oracle中的Oracle實例的概念,在一臺服務器中可以定義多個Queue Manager。 |
Queue |
隊列 |
是存放Message的對象,是我們主要操作的對象。類似與Oracle中的表的概念。 |
Message |
消息 |
實際放入Queue中的消息,該消息可以存儲字符串、Stream等對象。 |
Channel |
通道 |
是我們的應用以及兩個Queue Manager操作的鏈接對象 |
Process |
過程 |
|
Queue的分類:
Local Queue |
本地隊列 |
主要存儲消息的對象 |
Remote Queue |
遠程隊列 |
和另外一個Queue Manager通訊的隊列 |
Mode Queue |
模板隊列 |
建立一個隊列模板,通過這個模板可以建立與模板相同屬性的動態隊列。 |
Dynamic Queue |
動態對了(臨時隊列) |
可以在程序中創建和刪除的臨時隊列 |
Channel類型:
在我們介紹中只使用了類型爲SVRCONN的通道。
.Net連接Queue Manager的關鍵要素:
.Net的程序需要以下幾個關鍵要素才能連接的一個Queue Manager上。
1、 Address & Port
MQ的服務器地址以及要連接的Queue Manager的監聽端口,默認端口1414。
2、 Queue Manager Name
要連接的Queue Manager的名字,區分大小寫,默認全部大寫。
3、 Channel Name
SVRCONN類型的Channel的名字,需要注意的是該Channel的屬性MCAUSER必須設置爲一個足夠權限的系統用戶,否則不能連接成功。
4、 CCSID
CCSID是Queue Manager的編碼字符集,需要Queue Manager的CCSID與你的.Net操作系統的CCSID互相兼容或者一致才能成功連接。默認情況下UNIX平臺的Queue Manager的CCSID爲819,而簡體中文版的Windows的CCSID爲1381。這兩個編碼字符集是不能兼容的,所以需要調整。
調整有兩種方式:
1) 調整Queue Manager的CCSID,調整成與1381兼容的即可,不一定需要調整成1381
2) 在不能調整Queue Manager時需要配置Windows的環境變量,在Windows的環境變量中增加MQCCSID的環境變量,值需要與Queue Manager的CCSID一致或兼容。
在我們介紹的例子中使用環境如下:
Server:Sun OS 5.9
Address |
192.168.128.115 |
Port |
1414(默認端口) |
Queue Manager Name |
SGS.MGR |
Channel Name |
SGS.CHANNEL |
Queue Manager的屬性如下(注意紅色部分):
Display Queue Manager details.
DESCR( ) DEADQ( )
DEFXMITQ( ) CHADEXIT( )
CLWLEXIT( ) CLWLDATA( )
REPOS( ) REPOSNL( )
COMMANDQ(SYSTEM.ADMIN.COMMAND.QUEUE) QMNAME(SGS.MGR)
CRDATE(2007-04-02) CRTIME(16.24.23)
ALTDATE(2007-04-02) ALTTIME(16.24.23)
QMID(SGS.MGR_2007-04-02_16.24.23) TRIGINT(999999999)
MAXHANDS(256) MAXUMSGS(10000)
AUTHOREV(DISABLED) INHIBTEV(DISABLED)
LOCALEV(DISABLED) REMOTEEV(DISABLED)
PERFMEV(DISABLED) STRSTPEV(ENABLED)
CHAD(DISABLED) CHADEV(DISABLED)
CLWLLEN(100) MAXMSGL(4194304)
CCSID(819) MAXPRTY(9)
CMDLEVEL(510) PLATFORM(UNIX)
SYNCPT DISTL(YES)
Channel的屬性如下(注意紅色部分):
Display Channel details.
CHANNEL(SGS.CHANNEL) CHLTYPE(SVRCONN)
TRPTYPE(TCP) DESCR( )
SCYEXIT( ) MAXMSGL(4194304)
SCYDATA( ) HBINT(300)
MCAUSER(mqm) ALTDATE(2007-04-02)
ALTTIME(16.30.23)
SENDEXIT( )
RCVEXIT( )
SENDDATA( )
RCVDATA( )
由於Queue Manager的CCSID使用819,故增加系統的環境變量:
環境準備:
1、 安裝IBM WebSphere MQ Client for Windows。(MQ客戶端)
2、 安裝WebSphere MQ classes for Microsoft .NET.msi。(.Net插件)
3、 在你的.Net項目中引用 amqmdnet.dll,該dll在.Net插件安裝目錄中可以找到。
開始編寫代碼:
鏈接MQManager 及遠程隊列寫入信息:
public class ZYTaskMQDAC
{
private MQQueueManager mqQMgr = null;
private MQQueue mqueue = null;
public ZYTaskMQDAC()
{
CreateCon();
CreateQueue();
}
/// <summary>
/// 創建隊列管理器
/// </summary>
public void CreateCon()
{
if (this.mqQMgr == null)
{
try
{
string hostname = ConfigurationManager.AppSettings["HostName"]; //服務器的IP
string channel =ConfigurationManager.AppSettings["Channel"] ; //服務器通道
string qManager = ConfigurationManager.AppSettings["MQManaager"]; //隊列管理器名稱
string userName =ConfigurationManager.AppSettings["UserName"] ; //用戶名
string pword =ConfigurationManager.AppSettings["Password"] ; //用戶密
int mQPort=Convert.ToInt32(ConfigurationManager.AppSettings["MQPort"]); //MQ端口
//初始化環境變量
MQEnvironment.Hostname = hostname;
MQEnvironment.Channel = channel;
MQEnvironment.Port = mQPort;
MQEnvironment.UserId = userName;
MQEnvironment.Password = pword;
//構造隊列管理器
this.mqQMgr = new MQQueueManager(qManager);
}
catch (MQException ex)
{
//日子記錄創建列管理器 失敗
ExceptionService.Current.Handle(ex);
this.mqQMgr = null;
}
}
}
/// <summary>
/// 創建隊列
/// </summary>
private void CreateQueue()
{
string sendQueue=ConfigurationManager.AppSettings["SendQueue"]; //發送隊列名稱
try
{
if (this.mqQMgr == null)
return;
//通過MQ管理創建隊列實例
int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING | MQC.MQOO_INQUIRE;
mqueue = this.mqQMgr.AccessQueue(sendQueue, openOptions);
}
catch (MQException ex)
{
//日誌記錄 鏈接隊列管理失敗!
ExceptionService.Current.Handle(ex);
}
}
/// <summary>
/// 寫入隊列信息
/// </summary>
/// <param name="_strMsg"></param>
public void PutMsgToMQ(string _strMsg)
{
MQMessage mqmsg = null;
try
{
//創建消息操作實例
MQPutMessageOptions pmo = new MQPutMessageOptions();
//創建消息實例
mqmsg = new MQMessage();
mqmsg.CharacterSet = 1208; //設置消息編碼爲UTF-8
mqmsg.WriteString(_strMsg);
mqmsg.Format = MQC.MQFMT_STRING; //制定消息格式爲String
//發送消息
mqueue.Put(mqmsg, pmo);
}
catch (MQException ex)
{
//日誌記錄 發送消息失敗
ExceptionService.Current.Handle(ex);
}
}
/// <summary>
/// 關閉隊列 釋放連接
/// </summary>
public void CloseMQ()
{
if(mqueue!=null)
mqueue.Close();
if(mqQMgr!=null)
{
mqQMgr.Disconnect();
mqQMgr = null;
}
}
}