分布式应用消息监控系统详解
立即解锁
发布时间: 2025-08-26 02:12:36 阅读量: 21 订阅数: 14 

### 分布式应用消息监控系统详解
#### 1. 服务器端ASP页面:viewAllMessages.asp
viewAllMessages.asp是服务器端的ASP页面,由客户端的tester.asp页面调用。该页面的主要功能是将消息池的当前状态以XML文档的形式显示出来。其代码如下:
```asp
<?xml version="1.0" ?>
<%
If IsObject(Application("objMonitor")) Then
Response.Write cstr(Application("objMonitor").xmlDoc.xml)
Else
Response.Write "<error>Application(""objMonitor"") " & _
"is not an object.</error>"
End If
%>
```
此代码通过判断`Application("objMonitor")`是否为对象,若为对象则输出其`xmlDoc`的XML内容,否则输出错误信息。
#### 2. 消息池核心:MessageMonitor类
MessageMonitor类是系统的核心COM对象DistMessages中的一个类。在编写时,使用的是2000年7月的MSXML解析器技术预览版,可从http://msdn.microsoft.com/xml获取。若使用该版本,需在DistMessages项目的引用对话框中设置对Microsoft XML v3.0的引用。
##### 2.1 声明与初始化
在MessageMonitor类中,首先要声明并初始化`objSubscribers`私有变量:
```vb
Private objSubscribers As MSXML2.DOMDocument30
Private Sub Class_Initialize()
Dim objNode As Variant
Set objSubscribers = New MSXML2.DOMDocument30
Set objNode = objSubscribers.createElement("subscribers")
objSubscribers.appendChild (objNode)
End Sub
Public Property Get xmlDoc() As MSXML2.DOMDocument30
Set xmlDoc = objSubscribers
End Property
```
这里创建了一个`MSXML2.DOMDocument30`对象`objSubscribers`,并添加了一个`subscribers`节点。通过`xmlDoc`属性,外界可以对其进行只读访问。
##### 2.2 添加订阅者
在保留消息之前,需要有订阅者。以下代码实现了实体订阅特定类消息的功能:
```vb
Public Function subscribe(objXMLDoc As Variant) As Variant
Dim strSubscriber As String, strClass As String
Dim objNode As Variant, objClassNode As Variant
strSubscriber = objXMLDoc.selectSingleNode("//m:subscriber").Text
strClass = objXMLDoc.selectSingleNode("//m:class").Text
Set objNode = _
objSubscribers.selectSingleNode("/subscribers/subscriber[@name='" & _
strSubscriber & "']")
If TypeName(objNode) = "Nothing" Then
'// subscriber has not been added yet, add 'em in...
Set objNode = objSubscribers.createElement("subscriber")
Call objNode.setAttribute("name", strSubscriber)
objSubscribers.documentElement.appendChild (objNode)
End If
If TypeName(objNode.selectSingleNode("//class[@name='" & strClass & "' _
and ../@name='" & strSubscriber & "']")) = "Nothing" Then
'// subscriber is not registered for this class yet
Set objClassNode = objSubscribers.createElement("class")
Call objClassNode.setAttribute("name", strClass)
objNode.appendChild (objClassNode)
End If
Set objNode = Nothing
Set objClassNode = Nothing
Set subscribe = createResponse(objXMLDoc, "Subscriber:[" & _
strSubscriber & "] has been added for class:[" & _
strClass & "]")
End Function
```
该方法接收一个XML文档,从中提取订阅者名称和消息类名。若订阅者不存在,则添加订阅者节点;若订阅者未注册该消息类,则添加类节点。最后调用`createResponse`函数生成响应。
##### 2.3 创建SOAP响应
`createResponse`函数用于将字符串转换为SOAP响应:
```vb
Private Function createResponse(objXMLDoc As Variant, _
strMessage As String) As Variant
Dim objNewNode As Variant, objBody As Variant
Set objNewNode = objXMLDoc.createElement("m:result")
objNewNode.Text = strMessage
Set objBody = objXMLDoc.selectSingleNode("//SOAP-ENV:Body")
objBody.replaceChild objNewNode, objBody.firstChild
Set createResponse = objXMLDoc
End Function
```
该函数创建一个`m:result`节点,将消息内容赋值给该节点,然后替换SOAP消息体中的第一个子节点。
##### 2.4 发布消息
`publish`方法用于在包含消息池的XML文档中查找指定类的所有元素,并在每个元素下插入一个新的`<message>`元素:
```vb
Public Function publish(objXMLDoc As Variant) As Variant
Dim objNodeList As Variant, objMessage As Variant, ele As Variant
Dim strMessage As String, strClass As String
strMessage = objXMLDoc.selectSingleNode("//m:message").Text
strClass = objXMLDoc.selectSingleNode("//m:class").Text
Set objNodeList = objSubscribers.selectNodes("//class[@name='" & _
strClass & "']")
For Each ele In objNodeList
Set objMessage = objSubscribers.createElement("message")
objMessage.Text = strMessage
Call objMessage.setAttribute("time", Now)
ele.appendChild (objMessage)
Next
Set objMessage = Nothing
Set ele = Nothing
Set publish = createResponse(objXMLDoc, "Published message to " & _
objNodeList.length & " subscribers")
Set objNodeList = Nothing
End Function
```
该方法提取消息内容和消息类名,查找所有指定类的节点,为每个节点添加一个包含消息内容和时间的`<message>`节点。最后调用`createResponse`函数生成响应。
##### 2.5 移除订阅者
`unsubscribe`方法用于移除对特定类消息的订阅:
```vb
Public Function unsubscribe(objXMLDoc As Variant) As Variant
Dim strSubscriber As String, strClass As String
Dim objSubscriber As Variant
Dim objNode As Variant
Set objSubscriber = objXMLDoc.selectSingleNode("//m:subscriber")
strSubscriber = objSubscriber.Text
strClass = objXMLDoc.selectSingleNode("//m:class").Text
Set objNode = objSubscribers.selectSingleNode("//class[@name='" & _
strClass & "' and ../@name='" & strSubscriber & "']")
If
```
0
0
复制全文
相关推荐










