天天看點

.Net環境下操作IBM WebShpere MQ

本人在用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

.Net環境下操作IBM WebShpere MQ

//MQ管理執行個體

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

private MQQueueManager      mqQMgr=null;// MQQueueManager instance

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

private void CreateMng()

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

{

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

if(this.mqQMgr==null)

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

try

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

{     this.log("Create Queue Manager");                      

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

//通過MQ管理名建立MQ管理執行個體

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

//判斷是遠端連接配接還是本地連接配接

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

if(!this.checkBox1.Checked)  //本地連接配接 (伺服器連接配接)

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

this.mqQMgr = new MQQueueManager(this.tbQMng.Text);

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

else //遠端連接配接(用戶端連接配接)

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

string hostname = this.tbConnection.Text; //Server位址

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

string channel = this.tbChannel.Text;   //Channel 名

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

string qManager = this.tbQMng.Text;   //Queue Manager名

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

//初始化環境變量

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

                                          MQEnvironment.Hostname = hostname;

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

                                          MQEnvironment.Channel = channel;

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

                                          MQEnvironment.Port = Int32.Parse(this.textBox1.Text); //端口号

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

this.mqQMgr =new MQQueueManager(qManager);

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

                                   }

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

this.log("Create Queue Manager Sucess");

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

                            }

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

catch(MQException ex)

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

this.mqQMgr=null;

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

this.log("Create Queue Manager Failed!"+ex.Message+"reason:" + Convert.ToString( ex.Reason,16));

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

                     }

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

              }

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

向本地隊列(SGS.IN.01)放入消息:

  1

.Net環境下操作IBM WebShpere MQ

private void button1_Click(object sender, System.EventArgs e)

  2

.Net環境下操作IBM WebShpere MQ

  3

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

{

  4

.Net環境下操作IBM WebShpere MQ

  5

.Net環境下操作IBM WebShpere MQ

//定義隊列

  6

.Net環境下操作IBM WebShpere MQ

  7

.Net環境下操作IBM WebShpere MQ

                     MQQueue             mqQueue=null;

  8

.Net環境下操作IBM WebShpere MQ

  9

.Net環境下操作IBM WebShpere MQ

10

.Net環境下操作IBM WebShpere MQ

11

.Net環境下操作IBM WebShpere MQ

this.CreateMng();  //連接配接Queue Manager

12

.Net環境下操作IBM WebShpere MQ

13

.Net環境下操作IBM WebShpere MQ

14

.Net環境下操作IBM WebShpere MQ

15

.Net環境下操作IBM WebShpere MQ

try

16

.Net環境下操作IBM WebShpere MQ

17

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

18

.Net環境下操作IBM WebShpere MQ

19

.Net環境下操作IBM WebShpere MQ

if(this.mqQMgr==null)

20

.Net環境下操作IBM WebShpere MQ

21

.Net環境下操作IBM WebShpere MQ

return;

22

.Net環境下操作IBM WebShpere MQ

23

.Net環境下操作IBM WebShpere MQ

24

.Net環境下操作IBM WebShpere MQ

25

.Net環境下操作IBM WebShpere MQ

this.log("Create MQQueue");

26

.Net環境下操作IBM WebShpere MQ

27

.Net環境下操作IBM WebShpere MQ

28

.Net環境下操作IBM WebShpere MQ

29

.Net環境下操作IBM WebShpere MQ

//通過MQ管理建立隊列執行個體

30

.Net環境下操作IBM WebShpere MQ

31

.Net環境下操作IBM WebShpere MQ

                            mqQueue=this.mqQMgr.AccessQueue(this.tbQName.Text,MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING | MQC.MQOO_INQUIRE);  

32

.Net環境下操作IBM WebShpere MQ

33

.Net環境下操作IBM WebShpere MQ

//本例中this.tbQName.Text=”SGS.IN.01”

34

.Net環境下操作IBM WebShpere MQ

35

.Net環境下操作IBM WebShpere MQ

36

.Net環境下操作IBM WebShpere MQ

37

.Net環境下操作IBM WebShpere MQ

38

.Net環境下操作IBM WebShpere MQ

39

.Net環境下操作IBM WebShpere MQ

this.log("Create MQQueue Sucess");

40

.Net環境下操作IBM WebShpere MQ

41

.Net環境下操作IBM WebShpere MQ

42

.Net環境下操作IBM WebShpere MQ

43

.Net環境下操作IBM WebShpere MQ

                     }

44

.Net環境下操作IBM WebShpere MQ

45

.Net環境下操作IBM WebShpere MQ

catch(MQException ex)

46

.Net環境下操作IBM WebShpere MQ

47

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

48

.Net環境下操作IBM WebShpere MQ

49

.Net環境下操作IBM WebShpere MQ

50

.Net環境下操作IBM WebShpere MQ

51

.Net環境下操作IBM WebShpere MQ

this.log("Create MQQueue Failed!!"+ex.Message+"reason:" + Convert.ToString( ex.Reason,16));

52

.Net環境下操作IBM WebShpere MQ

53

.Net環境下操作IBM WebShpere MQ

54

.Net環境下操作IBM WebShpere MQ

55

.Net環境下操作IBM WebShpere MQ

56

.Net環境下操作IBM WebShpere MQ

57

.Net環境下操作IBM WebShpere MQ

58

.Net環境下操作IBM WebShpere MQ

59

.Net環境下操作IBM WebShpere MQ

//要放入隊列中的消息

60

.Net環境下操作IBM WebShpere MQ

61

.Net環境下操作IBM WebShpere MQ

MQMessage mqMsg =null; 

62

.Net環境下操作IBM WebShpere MQ

63

.Net環境下操作IBM WebShpere MQ

64

.Net環境下操作IBM WebShpere MQ

65

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

66

.Net環境下操作IBM WebShpere MQ

67

.Net環境下操作IBM WebShpere MQ

int count=Int32.Parse(this.tbCount.Text);

68

.Net環境下操作IBM WebShpere MQ

69

.Net環境下操作IBM WebShpere MQ

70

.Net環境下操作IBM WebShpere MQ

71

.Net環境下操作IBM WebShpere MQ

//建立消息操作執行個體

72

.Net環境下操作IBM WebShpere MQ

73

.Net環境下操作IBM WebShpere MQ

                            MQPutMessageOptions mqPutMsgOpts = new MQPutMessageOptions();

74

.Net環境下操作IBM WebShpere MQ

75

.Net環境下操作IBM WebShpere MQ

76

.Net環境下操作IBM WebShpere MQ

77

.Net環境下操作IBM WebShpere MQ

78

.Net環境下操作IBM WebShpere MQ

79

.Net環境下操作IBM WebShpere MQ

for(int i=0;i<count;i++)

80

.Net環境下操作IBM WebShpere MQ

81

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

82

.Net環境下操作IBM WebShpere MQ

83

.Net環境下操作IBM WebShpere MQ

this.log("Create Message");

84

.Net環境下操作IBM WebShpere MQ

85

.Net環境下操作IBM WebShpere MQ

//建立消息執行個體

86

.Net環境下操作IBM WebShpere MQ

87

.Net環境下操作IBM WebShpere MQ

                                   mqMsg = new MQMessage();

88

.Net環境下操作IBM WebShpere MQ

89

.Net環境下操作IBM WebShpere MQ

90

.Net環境下操作IBM WebShpere MQ

91

.Net環境下操作IBM WebShpere MQ

                                   System.Xml.XmlDocument doc = new System.Xml.XmlDocument();

92

.Net環境下操作IBM WebShpere MQ

93

.Net環境下操作IBM WebShpere MQ

                                   doc.Load(this.tbMsg.Text);

94

.Net環境下操作IBM WebShpere MQ

95

.Net環境下操作IBM WebShpere MQ

string msg=doc.OuterXml;  //以字元串的形式放入一個XML

96

.Net環境下操作IBM WebShpere MQ

97

.Net環境下操作IBM WebShpere MQ

98

.Net環境下操作IBM WebShpere MQ

99

.Net環境下操作IBM WebShpere MQ

                                   mqMsg.WriteString(msg);

100

.Net環境下操作IBM WebShpere MQ

101

.Net環境下操作IBM WebShpere MQ

//制定消息格式為String

102

.Net環境下操作IBM WebShpere MQ

103

.Net環境下操作IBM WebShpere MQ

                                   mqMsg.Format = MQC.MQFMT_STRING;

104

.Net環境下操作IBM WebShpere MQ

105

.Net環境下操作IBM WebShpere MQ

106

.Net環境下操作IBM WebShpere MQ

107

.Net環境下操作IBM WebShpere MQ

this.log("Create Message Sucess. Message:"+msg);

108

.Net環境下操作IBM WebShpere MQ

109

.Net環境下操作IBM WebShpere MQ

110

.Net環境下操作IBM WebShpere MQ

111

.Net環境下操作IBM WebShpere MQ

112

.Net環境下操作IBM WebShpere MQ

113

.Net環境下操作IBM WebShpere MQ

this.log("Begin Put Message");

114

.Net環境下操作IBM WebShpere MQ

115

.Net環境下操作IBM WebShpere MQ

//發送消息

116

.Net環境下操作IBM WebShpere MQ

117

.Net環境下操作IBM WebShpere MQ

                                   mqQueue.Put(mqMsg,mqPutMsgOpts);

118

.Net環境下操作IBM WebShpere MQ

119

.Net環境下操作IBM WebShpere MQ

this.log("Put Message Sucess");

120

.Net環境下操作IBM WebShpere MQ

121

.Net環境下操作IBM WebShpere MQ

122

.Net環境下操作IBM WebShpere MQ

123

.Net環境下操作IBM WebShpere MQ

                            }

124

.Net環境下操作IBM WebShpere MQ

125

.Net環境下操作IBM WebShpere MQ

126

.Net環境下操作IBM WebShpere MQ

127

.Net環境下操作IBM WebShpere MQ

catch (Exception ex)

128

.Net環境下操作IBM WebShpere MQ

129

.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ
.Net環境下操作IBM WebShpere MQ

130

.Net環境下操作IBM WebShpere MQ

131

.Net環境下操作IBM WebShpere MQ

this.log(ex.Message);

132

.Net環境下操作IBM WebShpere MQ

133

.Net環境下操作IBM WebShpere MQ

134

.Net環境下操作IBM WebShpere MQ

135

.Net環境下操作IBM WebShpere MQ

              }

136

.Net環境下操作IBM WebShpere MQ

繼續閱讀