本人在用C#連接配接UNIX下的Websphere時,總是會有代号2059的錯誤。但本人在測試環境下,用的是windows安裝環境下的Websphere沒有錯誤,百思不得其解,後看到此文,發現要設定一下環境變量,(由于Queue Manager的CCSID使用819,故增加系統的環境變量),後來成功。
轉發此文。
.Net環境下操作IBM WebShpere MQ
http://www.cnblogs.com/mshwu/articles/1068198.html
大約在兩年前項目使用了IBM MQ,本人積累了部分在.Net環境下操作IBM MQ的經驗。現将經驗與大家分享。
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插件安裝目錄中可以找到。
開始編寫代碼:
連接配接Queue Manager
//MQ管理執行個體
private MQQueueManager mqQMgr=null;// MQQueueManager instance
private void CreateMng()
{
if(this.mqQMgr==null)
try
{ this.log("Create Queue Manager");
//通過MQ管理名建立MQ管理執行個體
//判斷是遠端連接配接還是本地連接配接
if(!this.checkBox1.Checked) //本地連接配接 (伺服器連接配接)
this.mqQMgr = new MQQueueManager(this.tbQMng.Text);
else //遠端連接配接(用戶端連接配接)
string hostname = this.tbConnection.Text; //Server位址
string channel = this.tbChannel.Text; //Channel 名
string qManager = this.tbQMng.Text; //Queue Manager名
//初始化環境變量
MQEnvironment.Hostname = hostname;
MQEnvironment.Channel = channel;
MQEnvironment.Port = Int32.Parse(this.textBox1.Text); //端口号
this.mqQMgr =new MQQueueManager(qManager);
}
this.log("Create Queue Manager Sucess");
}
catch(MQException ex)
this.mqQMgr=null;
this.log("Create Queue Manager Failed!"+ex.Message+"reason:" + Convert.ToString( ex.Reason,16));
}
}
向本地隊列(SGS.IN.01)放入消息:
1
private void button1_Click(object sender, System.EventArgs e)
2
3
{
4
5
//定義隊列
6
7
MQQueue mqQueue=null;
8
9
10
11
this.CreateMng(); //連接配接Queue Manager
12
13
14
15
try
16
17
18
19
if(this.mqQMgr==null)
20
21
return;
22
23
24
25
this.log("Create MQQueue");
26
27
28
29
//通過MQ管理建立隊列執行個體
30
31
mqQueue=this.mqQMgr.AccessQueue(this.tbQName.Text,MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING | MQC.MQOO_INQUIRE);
32
33
//本例中this.tbQName.Text=”SGS.IN.01”
34
35
36
37
38
39
this.log("Create MQQueue Sucess");
40
41
42
43
}
44
45
catch(MQException ex)
46
47
48
49
50
51
this.log("Create MQQueue Failed!!"+ex.Message+"reason:" + Convert.ToString( ex.Reason,16));
52
53
54
55
56
57
58
59
//要放入隊列中的消息
60
61
MQMessage mqMsg =null;
62
63
64
65
66
67
int count=Int32.Parse(this.tbCount.Text);
68
69
70
71
//建立消息操作執行個體
72
73
MQPutMessageOptions mqPutMsgOpts = new MQPutMessageOptions();
74
75
76
77
78
79
for(int i=0;i<count;i++)
80
81
82
83
this.log("Create Message");
84
85
//建立消息執行個體
86
87
mqMsg = new MQMessage();
88
89
90
91
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
92
93
doc.Load(this.tbMsg.Text);
94
95
string msg=doc.OuterXml; //以字元串的形式放入一個XML
96
97
98
99
mqMsg.WriteString(msg);
100
101
//制定消息格式為String
102
103
mqMsg.Format = MQC.MQFMT_STRING;
104
105
106
107
this.log("Create Message Sucess. Message:"+msg);
108
109
110
111
112
113
this.log("Begin Put Message");
114
115
//發送消息
116
117
mqQueue.Put(mqMsg,mqPutMsgOpts);
118
119
this.log("Put Message Sucess");
120
121
122
123
}
124
125
126
127
catch (Exception ex)
128
129
130
131
this.log(ex.Message);
132
133
134
135
}
136