您的位置:首页 > 编程语言 > VB

用COM访问IBM Websphere MQ的VBScript监控脚本实例

2007-11-03 22:53 591 查看
最近有个项目要对Windows平台上的IBM MQ进行监控,要求用VBSctript实现(便于从MOM中调用),本以为很简单,没想到却很麻烦。主要是因为IBM对Windows平台的COM支持比较少,网上的文档和例子也比较少。用COM接口访问IBM MQ,需要注意以下问题:

1。IBM提供两种主要的COM接口:MQAX(WebSphere MQ Automation Classes for ActiveX classes)和MQAI(ActiveX interface to the MQAI)。MQAX提供对队列管理器、队列的访问,包括MQSession、MQQueueManager 、MQQueue、MQMessage、MQPutMessageOptions、MQGetMessageOptions、MQDistributionList、MQDistributionListItem等类,但通过MQAX无法直接访问Channel和Listener等信息。如果想监控Channel和Listener的状态,要通过MQAI提供的MQBag类。(具体参考IBM文档http://publibfp.boulder.ibm.com/epubs/pdf/amqtan03.pdf

2。MQBag类的使用要按照PCF命令规范设置不同参数,并取得返回值。(具体参考IBM手册http://publibfp.boulder.ibm.com/epubs/pdf/csqzac05.pdf

3。我们的IBM MQ安装在英文版windows 2003上,操作系统区域设置为简体中文,队列管理器的CCSID设置为819。MQBag类没有提供设置CCSID的办法,所以使用操作系统的缺省字符集936,但936无法转换为CCSID 819。所以,一调用MQBag类的ADD方法加入字符型Item,就会报错mqrc_not_converted。即使设置环境变量set ccsid=819也不起作用。所以脚本中使用了特殊的方法来设定MQBag的字符集(详见例子)。

4。Channel的不活动状态和Listener的停止状态在系统中无法取得,这对于监控来说,也是要关注的状态,程序中也有特殊处理。

5。还可以通过ADSI接口访问IBM MQ,但一定要安装MQ Client,否则会报错,感兴趣的可以自己尝试,本例不使用ADSI。

Call main

Sub main()

On Error Resume Next

strQmgr = "qmtest2"
strReqQName = "SYSTEM.ADMIN.COMMAND.QUEUE"
strRepQName = "SYSTEM.DEFAULT.LOCAL.QUEUE"

Set sess = CreateObject("mqax200.MQSession")
'Get Access to Queue Manager
Set qm = sess.AccessQueueManager(strQmgr)
If Err <> 0 Then
MsgBox "Can not Connect Queue Manager: " & strQmgr
Exit Sub
End If

'Get Access to Request Queue
Set requestQ = qm.AccessQueue(strReqQName, 16 Or 32 Or 8192) 'MQOO_OUTPUT Or MQOO_INQUIRE Or MQOO_FAIL_IF_QUIESCING)
If Err <> 0 Then
MsgBox "Can not Open Reuest Queue: " & strReqQName
Exit Sub
End If

'Get Access to Reply Queue
Set replyQ = qm.AccessQueue(strRepQName, 2 Or 32 Or 8192) 'MQOO_INPUT_SHARED Or MQOO_FAIL_IF_QUIESCING Or MQOO_INQUIRE)
If Err <> 0 Then
MsgBox "Can not Open Reply Queue: " & strRepQName
Exit Sub
End If

'Create MQ Bag
Set mqadminbag = CreateObject("MQBag.MQBag")
Set optsbag = CreateObject("MQBag.MQBag")
'Set Admin Bag
mqadminbag.Options = 1 'MQCBO_ADMIN_BAG
'set mqbag CharacterSet = 819
Set aMessage = mqadminbag.ToMessage(optsbag)
aMessage.CharacterSet = 819
mqadminbag.FromMessage aMessage, optsbag
If Err <> 0 Then
MsgBox "Can not Create Message Bag."
Exit Sub
End If

'Query Local Queue length
mqadminbag.Add "*", 2016 'MQ.MQCA_Q_NAME
mqadminbag.Add 1, 20 'MQ.MQQT_LOCAL, MQ.MQIA_Q_TYPE
mqadminbag.AddInquiry 3 'MQ.MQIA_CURRENT_Q_DEPTH
Set mqreplybag = mqadminbag.Execute(qm, 13, optsbag, requestQ, replyQ) 'MQ.MQCMD_INQUIRE_Q
For i = 0 To mqreplybag.Count - 1
Set RmqBag = mqreplybag.Item(4001, i) 'MQHA_BAG_HANDLE = 4001
strTmpQname = RmqBag(2016) ' Get MQCA_Q_NAME
If Err <> 0 Then
MsgBox "Can not Get Local Queue Length. "
Exit Sub
End If
nTmpQLength = RmqBag(3) ' Get MQIA_CURRENT_Q_DEPTH
MsgBox strTmpQname & " Length is: " & nTmpQLength
Next

'clear bag
mqadminbag.Clear
'set mqbag CharacterSet = 819
Set aMessage = mqadminbag.ToMessage(optsbag)
aMessage.CharacterSet = 819
mqadminbag.FromMessage aMessage, optsbag
'Query Channel Status
mqadminbag.Add "*", 3501 'MQ.MQCACH_CHANNEL_NAME
mqadminbag.Add 1011, 1523 'MQ.MQOT_CURRENT_CHANNEL, MQ.MQIACH_CHANNEL_INSTANCE_TYPE
mqadminbag.AddInquiry 1527 'MQ.MQIACH_CHANNEL_STATUS
Set mqreplybag = mqadminbag.Execute(qm, 42, optsbag, requestQ, replyQ) 'MQ.MQCMD_INQUIRE_CHANNEL_STATUS
For i = 0 To mqreplybag.Count - 1
Set RmqBag = mqreplybag.Item(4001, i) 'MQHA_BAG_HANDLE = 4001
strTmpChname = RmqBag(3501) ' Get MQ.MQCACH_CHANNEL_NAME
nTmpChStatus = RmqBag(1527) ' Get MQ.MQCMD_INQUIRE_CHANNEL_STATUS
If Err <> 0 Then
MsgBox "Can not Get Channel Status. "
Exit Sub
End If
If nTmpChStatus = 3 Then
MsgBox strTmpChname & " Status is: " & nTmpChStatus & " (running)"
Else
MsgBox strTmpChname & " Status is: " & nTmpChStatus & " (not running)"
End If
Next

'clear bag
mqadminbag.Clear
'set mqbag CharacterSet = 819
Set aMessage = mqadminbag.ToMessage(optsbag)
aMessage.CharacterSet = 819
mqadminbag.FromMessage aMessage, optsbag
'Query Listener Status
mqadminbag.Add "*", 3554 'MQCACH_LISTENER_NAME
mqadminbag.AddInquiry 1599 'MQIACH_LISTENER_STATUS
Set mqreplybag = mqadminbag.Execute(qm, 98, optsbag, requestQ, replyQ) 'MQCMD_INQUIRE_LISTENER_STATUS
For i = 0 To mqreplybag.Count - 1
Set RmqBag = mqreplybag.Item(4001, i) 'MQHA_BAG_HANDLE = 4001
strTmpChname = RmqBag(3554) ' Get MQCACH_LISTENER_NAME
nTmpChStatus = RmqBag(1599) ' Get MQIACH_LISTENER_STATUS
If Err <> 0 Then
MsgBox "Can not Get Listener Status. "
Exit Sub
End If
If nTmpChStatus = 2 Then
MsgBox strTmpChname & " Status is: " & nTmpChStatus & " (running)"
Else
MsgBox strTmpChname & " Status is: " & nTmpChStatus & " (not running)"
End If
Next
End Sub
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: