第十三章 用ActiveX编程
目标
学习使用WebSphere MQ automatin classes for ActiveX编程。
13.1 概述
WebSphere MQ Automation Classes for ActiveX 是又一组允许程序员处理队列管理器对象的API。WebSphere MQ Automation Classes for ActiveX 的组成部分为希望开发可在Windows 平台上运行的WebSphere MQ 应用程序的设计人员和程序员们提供了可用的类。因为我们可以利用实现语言的本身语法来编写WebSphere MQ 对象的代码,因此这些类可以很容易地被整合到任意应用程序中。应用程序的整体设计与任何WebSphere MQ 应用程序的设计都是一样的。
我们在这里要重点指出的是那些与ActiveX 相关的概念。ActiveX 组件是以组件对象模型(Component Object Model,缩写为COM)为基础的,它是由Microsoft 定义的基于对象的编程模型。该模型确定了如何使软件组件可以确定彼此的位置并进行相互通讯,而不必在乎使用的是何种计算机语言或其物理位置如何。
COM 是形成更高级软件服务(如OLE 提供的服务)基础的底层架构。COM 简化了强大的基于组件的应用程序的开发工作。从其原始的单一机器应用,COM 已经扩展到允许访问其他系统的组件。这一新的模型被称作分布式COM(Distributed COM),也被简称为DCOM。
DCOM 使得我们可以利用组件来创建网络式应用程序。它扩展了COM,可以在局域网、广域网甚至因特网上支持不同电脑间的通讯。利用DCOM,应用程序的分布位置可以做到对客户和应用程序本身最有意义。COM+是COM 的另一个延伸。它提供可从任何编程语言或工具使用的运行时间环境和服务,并且使得组件之间的大范围相互操作性成为可能,而不管实现的方式如何。COM+为从互动的对象创建软件系统提供了一种简单、强大的模型。与对象进行的所有通讯必须通过界面发生,并且所有通讯都必须看起来像简单的方法调用,即便目的地对象位于另一进程之中或在另一台机器上。
在利用WebSphere MQ Automation Classes for ActiveX 设计ActiveX 应用程序时,最重要的信息项目就是发送的消息或从远程WebSphere MQ 系统中接收的消息。为了让WebSphere MQ Automation Classes 脚本工作,发送方和接收应用程序都必须知道消息结构。而且,在考虑如何构建设计中的应用程序的实现时,我们应当记住,WebSphere MQ Automation Classes for ActiveX 脚本运行的机器与WebSphere MQ 队列管理器或WebSphere MQ 客户安装的机器相同。
WebSphere MQ Automation Classes for ActiveX 的主要特性如下:
提供对WebSphere MQ API 所有函数和特性的访问。这就使得可与其他非Windows 的WebSphere MQ 平台建立完全的相互关联;
兼容ActiveX 惯例;
兼容WebSphere MQ 对象模型;
使得使用它的ActiveX 应用程序能够在任何通过WebSphere MQ 可以访问的企业系统上运行事务处理和访问数据。
WebSphere MQ Automation Classes for ActiveX 采用的是自由线程模型,在这种模型中,对象可在线程间使用。类允许使用MQQueue 和MQQueueManager 对象,但WebSphere MQ 一般不允许在不同线程间分享句柄(the sharing of handles)。
尽管使用这些类有一定的好处,但同时也有一些限制。下面就是一些限制的例子:
如果打算用网络浏览器来访问应用程序的话,浏览器必须支持ActiveX 控件(如Microsoft Internet Explorer 3 或更高版本)。如果用WebSphere MQ 向其执行的机器外发送数据的话,那么恶意脚本可能会钻这个空子并制造安全问题;
Automation Classes 常量对VBScript 和JavaScript 程序不可用,因此程序员必须对其进行硬编码(这些常量可在随WebSphere MQ 产品提供的cmqc.h 标题文件中找到)。
13.2 平台和语言
WebSphere MQ Automation Classes for ActiveX 只能用于32 位ActiveX 脚本客户机。因此,这些类只能用于以下平台:
Windows 98/95
Windows NT
Windows 2000
我们可以利用支持COM 对象创建和使用的语言来编写使用WebSphere MQ Classes for ActiveX 的应用程序,例如Visual Basic、Java 和其他ActiveX 脚本客户机。这些类可以
简单地整合到应用程序中,因为我们可以用实现语言的本身语法来编写WebSphere MQ 对象的代码。为了在WebSphere MQ 服务器环境中运行ActiveX 组件,您必须拥有Windows NT 4.0 (如果打算使用MTS 作为事务处理协同器的话,还应具备Service Pack 6 和Option Pack4)或Windows 2000 和WebSphere MQ 版本5.1 或更高。
13.3 库
如果应用程序在使用WebSphere MQ Automation Classes for ActiveX 的话,它将需要MQAX200.dll 链接库。这个库可以在WebSphere MQ Base Directory\bin 下找到。当编写应用程序时,其中应包括该库。在Visual Basic 中,我们可以通过向程序引用添加mqax200.dll来实现此目的。欲了解更多信息,请参见Visual Basic 产品文档。
13.4 架构模型
WebSphere MQ Automation Classes for ActiveX 提供以下对象:
MQSession:这是WebSphere MQ Automation Classes for ActiveX 的主类。它包含对任何其他类进行的上一次动作的状态。每个ActiveX 进程只有一个MQSession 对象。如果尝试创建第二个此类对象的话,将创建原始对象的第二个引用;
MQQueueManager:此类提供到队列管理器的访问。调用该对象的方法和属性将发出通过MQI 的调用。在此类的对象毁坏后,它将自动从队列管理器断开连接。可以通过此调用访问的某些属性是预备用户ID、完成代码、连接状态和原因代码。这些属性大多数只有在对象连接到队列时才能进行访问。
MQQueue:此类提供到队列及其属性的访问,如当前深度、深度高度限制等。
MQMessage:此类代表着一条WebSphere MQ 消息。该类不仅包括访问消息描述器的属性,还提供储存消息数据的缓冲区。它包括写入方法,可以从ActiveX 应用程序中拷贝数据到MQMessage 对象,还提供读取方法,可以从MQMessage 对象中拷贝数据到ActiveX 应用程序。这个类自动管理向缓冲区分配内存和取消其内存分配。在创建MQMessage 对象时,应用程序不必声明缓冲区的大小,因为缓冲区会随着写入其中的数据大小而变化;
MQPutMessageOptions:此类包括所有控制放置消息行为的不同的选项;
MQGetMessageOptions:此类包括所有控制获取消息行为的不同的选项;
MQDistributionList:此类包括获得输出的本地、远程或假名队列的集合;
MQDistributionListItem:此类包括MQOR、MQRR 和MQMR 结构,并将其与拥有分配表(owning distribution list)相关联。
13.5 用WebSphere MQ automatin classes for ActiveX编程
在下面这节中,我们将看看如何利用WebSphere MQ Automation Classes for ActiveX 连接和操作队列管理器对象。这节中的例子都以Visual Basic 编写。
13.5.1 连接到队列管理器
WebSphere MQ Automation Classes for ActiveX 遵循与AMI 相同的结构。您必须先创建会话对象,以便连接到队列管理器。为了创建MQSession 类的实例,我们如下将采用New 关键词:
Set SessionObject = New MQSession
一旦创建了会话对象,就必须建立到队列管理器的连接。我们利用MQSession 类的AccessQueueManager()方法来实现这一目的。该方法实际上将连接队列管理器、打开队列管理器并设置初始属性值。
Set QueueManagerObject =SessionObject.AccessQueueManager(QmgrName as string)
该方法所需的唯一参数就是队列管理器名。如果需要访问默认队列管理器名的话,那么就使用空串,而不使用队列管理器名。我们可以利用WebSphere MQ 客户来建立连接,也可以直接连接到WebSphere MQ 服务器来建立连接。如果连接对象失败的话,那么将举出错误事件并设置对象的原因代码和完成代码以及MQSession 对象的原因代码和完成代码。
下例显示了如何连接到默认队列管理器。
例,连接到默认队列管理器
Dim MQSess As MQSession '* session object(会话对象)
Dim QMgr As MQQueueManager '* queue manager object(队列管理器对象)
Set MQSess = New MQSession
Set QMgr = MQSess.AccessQueueManager("")
另一种可以用来连接到队列管理器的方法就是采用MQQueueManager 类的Connect()方法。在调用此方法前,必须设置队列管理器名。我们利用MQQueueManager 类的Name属性来实现这一目的。
例6-2 显示了如何利用上述调用来连接到名为SAMPLE.OMGR1 的队列管理器。
例6-2 连接到队列管理器
Dim MQSess As MQSession '* session object(会话对象)
Dim QMgr As MQQueueManager '* queue manager object(队列管理器对象)
Set MQSess = New MQSession
Set QMgr = New MQQueueManager
QMgr.Name=“SAMPLE.QMGR1”
QMgr.Connect
13.5.2 打开WebSphere MQ对象
一旦我们已经成功建立了到队列管理器的连接,接下来我们就可以打开WebSphere MQ 对象了。这些对象可以是:
队列(远程队列、本地队列、动态队列);
分配表;
消息。
为了打开队列,我们要使用MQQueueManager()类的AccessQueue()方法:
Set QueueObject = QueueManagerObject.AccessQueue(QueueName asstring,
OpenOption as Long,
QueueManagerName as string,
DynamicQueueName as string,
AlternateUserId as string)
QueueName 就是队列名。在尝试连接到队列管理器之前,队列必须被创建。OpenOption
参数是用来确定控制打开队列行为的选项的。最常用的打开选项如下:
MQOO_INPUT_SHARED:当应用程序需要从队列获取消息时使用。它在分享访
问模式中打开队列,因此多个应用程序可以同时从队列接收消息。该选项只能用
于本地队列、别名队列和模型队列。
MQOO_INPUT_EXCLUSIVE:当应用程序需要从队列获取消息时使用。它在独占
模式中打开队列。该选项仅对本地队列、别名队列和模型队列有效。
MQOO_OUTPUT:如果应用程序将在队列中放置消息的话,则应使用该选项。它
对所有类型的队列有效,包括远程队列和分配表。
QueueManagerName 也用来指定拥有队列的队列管理器名。该参数通常被省略,因为我
们已经创建了引用队列管理器的MQQueueManager 对象。如果QueueName 是模型队列
的话,那么将使用DynamicQueueName 来向将创建的动态队列分配一个名。
例6-3 显示了如何打开一个命名为PTP.QUEUE.LOCAL 的队列,它定义在默认队列管理器中。
例6-3 打开队列
Dim MQSess As MQSession '* session object(会话对象)
Dim QMgr As MQQueueManager '* queue manager object(队列管理器对象)
Dim ITSOQueue As MQQueue '* input queue object(输入队列对象)
Set MQSess = New MQSession
Set QMgr = MQSess.AccessQueueManager("")
Set ITSOQueue = QMgr.AccessQueue(“PTP.QUEUE.LOCAL”,MQOO_OUTPUT)
‘ If PTP.QUEUE.LOCAL needs to be opened to get and receive messages, the
PTP.QUEUE.LOCAL)
‘ call will look like this:(调用看起来将这样)
‘ Set ITSOQueue = QMgr.AccessQueue(“PTP.QUEUE.LOCAL”, _
‘ MQOO_OUTPUT + MQOO_INPUT_SHARED)
提示:如果要打开的队列是本地队列的话,那么请不要设置QueueManagerName 或将其
设为。如果将其设为拥有队列的远程队列管理器的名的话,那么将尝试打开远程队列的
本地定义。
当需要发送消息到多个目的地时,我们可以利用MQDistributionlist 对象。与MQQueue
对象相似,我们需要创建一个此类型的对象。如下所示,我们可以利用New 关键词来
实现这一目的:
Set DistributionListObject = New MQDistributionList
创建MQDistributionList 对象的引用后,我们应当指定引用到队列管理器(在此定义分
配表)的MQQueueManager 对象。此目的可以通过利用MQDistributionList 对象的
ConnectionReference 属性来实现。
DistributionListObject.ConnectionReference = QueueManagerObject
一旦指定到队列管理器的引用后,那么最后要做的一件事就是将队列添加到分配表中。
每个队列必须与MQDistributionListItem 对象相关联。我们可以利用MQDistributionList
类的AddDistributionListItem()方法来实现此目的。
Set DistributionListItemObject =
DistributionListObject.AddDistributionListItem(QueueName as string,
QueueMgrName as string)
QueueName 就是需要成为分配表一部分的队列的名,QueueMgrName 指的是拥有队列的
队列管理器。
例6-4 显示了如何发送一条消息到两个队列PTP.QUEUE.LOCAL 和
PTP.QUEUE2.LOCAL,它们定义在队列管理器SAMPLE.QMGR1 中:
例6-4 发送消息
Dim MQSess As MQSession '* session object(会话对象)
Dim QMgr As MQQueueManager '* queue manager object(队列管理器对象)
Dim DistListItem1 As MQDistributionListItem
Dim DistListItem2 As MQDistributionListItem
Dim SampleMsg As MQMessage
Set MQSess = New MQSession
Set QMgr = MQSess.AccessQueueManager("SAMPLE.QMGR1")
Set DistList = New MQDistributionList
DistList.ConnectionReference = QMgr
Set DistListItem1 = DistList.AddDistributionListItem(“PTP.QUEUE.LOCAL”)
Set DistListItem2 = DistList.AddDistributionListItem(“PTP.QUEUE2.LOCAL”)
Set SampleMsg = MQSess.AccessMessage()
SampleMsg.MessageData = “Sample Message”
DistList.OpenOptions = MQOO_OUTPUT
DistList.Open
DistList.Put SampleMsg
End Sub
另一个需要在发送或接收消息之前被创建的对象就是消息对象。正如我们在前面提到的那样,消息对象类包含消息数据和访问消息描述器的属性。此类型的对象可以利用MQSession 类的AccessMessage()来创建:
Set MessageObject = SessionObject.AccessMessage()
消息数据由MessageData 属性分配。举例来说,如果您需要发送消息“Sample Message”的话,那么该字符串必须被引用到消息对象上,见例6-5。
例6-5 分配
MessageObject.Message = “Sample Message”
我们可以简单地设置CharacterSet 属性为队列管理器的编码字符集标识符(MQCCSI_Q_MGR)并将它作为字符串传递,从而把二进制数据传递到WebSphere MQ 消息中。
13.5.3 基本操作
在第6.5.2 节《打开WebSphere MQ 对象》(见本书第186 页)中,我们看到了如何创建并打开不同的队列管理器对象。现在,对象已经创建了,那么接下来我们将谈谈可以对这些对象进行哪些基本操作。基本操作包括获取消息和发送消息。
发送消息
在发送消息之前,必须用MQOO_OUTPUT 选项打开队列。为了发送消息,必须使用MQQueue 对象的Get()方法。
QueueObject.Put(MessageObject, PutMsgOptionsObject)
MessageObject 代表将要发送消息的对象。因此,这种类型的对象必须创建在调用之前。另外,我们可以指定PutMsgOptions 对象,它包含控制放置操作的选项。如果没有指定PutMsgOptions 对象的话,那么将使用默认的PMOs。如果要使用该选项的话,那么就应当利用MQSession 类的AccessPutMessageOptions ( ) 对象来创建MQPutMessageOptions。
下例显示了如何用PMO 选项MQPMO_NO_SYNCPOINT(放置消息时无同步点控制)
将消息放入一个称作PTP.QUEUE.LOCAL 的队列。
例, 放置消息
Dim MQSess As MQSession '* session object(会话对象)
Dim QMgr As MQQueueManager '* queue manager object(队列管理器对象)
Dim ITSOQueue As MQQueue '* input queue object(输入队列对象)
Dim PutOptions As MQPutMessageOptions '* put message options(放置消息选项)
Dim SampleMsg As MQMessage '* message object for put(放置消息对象)
Set MQSess = New MQSession
Set QMgr = MQSess.AccessQueueManager("")
Set SampleQueue = QMgr.AccessQueue(“PTP.QUEUE.LOCAL”,MQOO_OUTPUT)
Set SampleMsg = MQSess.AccessMessage()
Set PutOptions = MQSess.AccessPutMessageOptions()
SampleMsg.MessageData = “Sample Message”
PutOptions.Options = MQPMO_NO_SYNCPOINT
SampleQueue.put SampleMsg PutOptions
请记住,MQPutMessageOptions 对象包含控制放置消息到WebSphere MQ 队列上这一行为的各种选项。
为了同时发送多条消息,我们要用到MQDistributionListObject 类的put()方法。正如发送一条消息到单一队列一样,在开始发送多条消息之前,我们需要用MQDistribution类的OpenOptions 属性以MQOO_OUTPUT 选项打开分配表。然后,我们将用MQDistributionList 类的open()方法打开分配表中定义的对象。
下例显示了如何发送一条消息到两个队列PTP.QUEUE.LOCAL 和PTP.QUEUE2.LOCAL,它们定义在队列管理器SAMPLE.QMGR1 中。
例, 发送消息
Dim MQSess As MQSession '* session object(会话对象)
Dim QMgr As MQQueueManager '* queue manager object(队列管理器对象)
Dim DistListItem1 As MQDistributionListItem
Dim DistListItem2 As MQDistributionListItem
Dim SampleMsg As MQMessage
Set MQSess = New MQSession
Set QMgr = MQSess.AccessQueueManager("SAMPLE.QMGR1")
Set DistList = New MQDistributionList
DistList.ConnectionReference = QMgr
Set DistListItem1 = DistList.AddDistributionListItem(“PTP.QUEUE.LOCAL”)
Set DistListItem2 = DistList.AddDistributionListItem(“PTP.QUEUE2.LOCAL”)
Set SampleMsg = MQSess.AccessMessage()
SampleMsg.MessageData = “Sample Message”
DistList.OpenOptions = MQOO_OUTPUT
DistList.Open
DistList.Put SampleMsg
接收消息
为了接收消息,我们要利用MQQueue 类的get()方法。请记住,在我们可以接收消息前,必须用MQOO_INPUT_EXCLUSIVE 或MQOO_INPUT_SHARE 打开队列。
QueueObject.Get(MessageObject, GetMsgOptionsObject, MsgLength)
MessageObject 即代表将被接收消息的对象。因此,在调用前必须创建这种类型的对象。另外,我们可以指定GetMsgOptionsObject,它包含控制获取操作的选项。但是,如果没有指定它的话,那么将使用默认的GMOs。如果将使用该选项的话,那么我们应当用MQSession 类的AccessGetMessageOptions()方法来创建MQGetMessageOptions 对象。从WebSphere MQ 接收消息有两种方法:
用Visual Basic 计时器函数发出get()后等待,这是轮询(polling)的方法;
用Wait 选项发出get()。设置WaitInterval 属性以指定等待时间。如果正在运行的软件是单线程的,而系统却是多线程的话,那么我们推荐采用此种方法。这将避免使您的系统无限期死锁。
如果WebSphere MQ 应用程序是消息的发信方并且WebSphere MQ 生成AccountToken 、
CorrelationId、GroupId 和MessageId 的话,那么我们建议您利用AccountTokenHex、
CorrelationIdHex、GroupIdHex 和MessageIdHex 属性,如果您希望查看它们的值或想对
其进行任何操作(包括在消息中将其传递回WebSphere MQ)。这样做的原因在于,WebSphere MQ生成的值是0 到255 之间任意值(包括0 和255)的字节串。它们不是可打印的字符串。如果上方法成功的话,那么到来的消息的MQMD 和消息数据会完全代替MQMessage对象的MQMD 和消息数据。如果不成功的话,MQMessage 对象不会改变。如果消息缓冲区的内容没有定义的话,那么整个消息长度就设为应当接收到的消息的完全长度。如果未指定消息长度参数的话,那么消息缓冲区长度则自动调整为至少是将到达的消息的大小。
下例显示了如何从一个命名为PTP.QUEUE.LOCAL 的队列获取消息,然后如何在命名为txtMessageData 的文本框中显示消息。
例,获取消息
Dim MQSess As MQSession '* session object(会话对象)
Dim QMgr As MQQueueManager '* queue manager object(队列管理器对象)
Dim ITSOQueue As MQQueue '* input queue object(输入队列对象)
Dim GetOptions As MQGetMessageOptions '* get message options(获取消息选项)
Dim SampleMsg As MQMessage '* message object for put(放置消息对象)
Set MQSess = New MQSession
Set QMgr = MQSess.AccessQueueManager("")
Set SampleQueue = QMgr.AccessQueue(“PTP.QUEUE.LOCAL”,MQOO_INPUT_SHARED)
Set SampleMsg = MQSess.AccessMessage()
Set GetOptions = MQSess.AccessGetMessageOptions()
GetOptions.Options = GetOptions.Options Or MQGMO_NO_SYNCPOINT
SampleQueue.get SampleMsg GetOptions
txtMessageData.text = SampleMsg.MessageData
13.5.4 关闭对象
一旦已经发送或接收消息并且已经处理数据,我们就可以关闭对象了。我们可以利用需
要关闭对象(队列管理器、队列或分配表)的close()方法来实现此目的。
QueueManagerObject.Close
QueueObject.Close
DistributionListObject.Close
如果要关闭动态队列而且我们就是创建动态队列者的话,那么我们在用MQQueue 类的
CloseOptions 属性时,应当在关闭选项中指定下面选项中的任意一个:
MQCO_DELETE:删除队列;
MQCO_DELETE_PURGE:仅在清除所有消息后删除队列。
13.5.5 关闭连接
为了断开与队列管理器的连接,我们可以利用MQQueueManager 类的Disconnect()方
法:
QueueManagerObject.Disconnect
所有与MQQueueManager 对象相关联的队列对象都将不可用,且不能重新打开。任何未
提交的改变(消息放置和获取)都被提交。
13.6 事务处理管理
用来控制事务处理的API 调用取决于使用中的事务处理的类型。有以下三种情境:
当WebSphere MQ 消息(本地工作单位)是唯一的资源时。在此种情况下,根据MQPutMessageOptions 或MQGetMessageOptions 对象的MQPMO_SYNCPOINT 或MQGMO_SYNCPOINT 选项的指定,事务处理由同步点控制下的第一个被发送或接收的消息启动。同一个工作单位可以包括多个消息。事务处理可以利用Commit()方法提交,也可以利用MQQueueManager 对象的Backout()方法取消。
下例显示了如何在同步点控制下放置消息。
例,在同步点下放置消息
Dim MQSess As MQSession '* session object(会话对象)
Dim QMgr As MQQueueManager '* queue manager object(队列管理器对象)
Dim ITSOQueue As MQQueue '* input queue object(输入队列对象)
Dim PutOptions As MQPutMessageOptions '* put message options(放置消息选项)
Dim SampleMsg As MQMessage '* message object for put(放置消息选项)
Set MQSess = New MQSession
Set QMgr = MQSess.AccessQueueManager("")
Set SampleQueue = QMgr.AccessQueue(“PTP.QUEUE.LOCAL”,MQOO_OUTPUT)
Set SampleMsg = MQSess.AccessMessage()
Set PutOptions = MQSess.AccessPutMessageOptions()
SampleMsg.MessageData = “Sample Message”
PutOptions.Options = MQPMO_SYNCPOINT
SampleQueue.put SampleMsg PutOptions
‘Perform any actions before the message is put on the queue
QMGr.Commit
下例显示了如何在同步点控制下获取消息。
例,在同步点下获取消息
Dim MQSess As MQSession '* session object(会话对象)
Dim QMgr As MQQueueManager '* queue manager object(队列管理器对象)
Dim ITSOQueue As MQQueue '* input queue object(输入队列对象)
Dim GetOptions As MQGetMessageOptions '* get message options(获取消息选项)
Dim SampleMsg As MQMessage '* message object for put(放置消息对象)
Set MQSess = New MQSession
Set QMgr = MQSess.AccessQueueManager("")
Set SampleQueue = QMgr.AccessQueue(“PTP.QUEUE.LOCAL”,MQOO_INPUT_SHARED)
Set SampleMsg = MQSess.AccessMessage()
Set GetOptions = MQSess.AccessGetMessageOptions()
GetOptions.Options = GetOptions.Options Or MQGMO_SYNCPOINT
SampleQueue.get SampleMsg GetOptions
‘Perform any validations before the message is physically removed
‘from the queue. (执行任意确认)
....
QMgr.Commit
txtMessageData.text = SampleMsg.MessageData
...
‘If an error ocurred during the validation, don’t retreive the message and
‘display the error message
If MQSess.CompletionCode <> MQCC_OK Then
QMgr.Backout
ErrMsg = Err.Description
StrPos = InStr(ErrMsg, " ") ' * search for first blank(搜索第一个空格)
If StrPos > 0 Then
Print Left(ErrMsg, StrPos)
Else
Print Error(Err) '* print complete error object(打印完整的错误对象)
End If
Print ""
Print "WebSphere MQ Completion Code = " & MQSess.CompletionCode
Print "WebSphere MQ Reason Code = " & MQSess.ReasonCode
Print "(" & MQSess.ReasonName & ")"
End If
当WebSphere MQ 作为扩展架构事务处理协同器(全局工作单位)时。事务处理必须在
第一个可恢复资源(如关系数据库)改变前用MQQueueManager 类的begin()方
法显式启动。而后,工作单位可以利用commit()方法提交,或者利用
MQQueueManager 对象的backout()方法取消。
下例显示了在WebSphere MQ 作为扩展架构事务处理协同器时我们可以如何利用
WebSphere MQ Automation Classes for ActiveX。
Dim MQSess As MQSession '* session object(会话对象)
Dim QMgr As MQQueueManager '* queue manager object(队列管理器对象)
Dim ITSOQueue As MQQueue '* input queue object(输入队列管理器对象)
Dim PutOptions As MQPutMessageOptions '* put message options(放置信息选项)
Dim SampleMsg As MQMessage '* message object for put(放置信息选项)
‘Connect to the database(连接到数据库)
...
Set MQSess = New MQSession
Set QMgr = MQSess.AccessQueueManager("")
Set SampleQueue = QMgr.AccessQueue(“PTP.QUEUE.LOCAL”,MQOO_OUTPUT)
Set SampleMsg = MQSess.AccessMessage()
Set PutOptions = MQSess.AccessPutMessageOptions()
QMgr.Begin
SampleMsg.MessageData = “Sample Message”
PutOptions.Options = MQPMO_SYNCPOINT
SampleQueue.put SampleMsg PutOptions
‘Perform any validations and update the table(执行任何确认以及升级表格)
...
QMGr.Commit
‘If an error ocurred during the validation, don’t put the message on the queue
‘and display the error message
If MQSess.CompletionCode <> MQCC_OK Then
QMgr.Backout
ErrMsg = Err.Description
StrPos = InStr(ErrMsg, " ") ' * search for first blank(搜索第一个空格)
If StrPos > 0 Then
Print Left(ErrMsg, StrPos)
Else
Print Error(Err) '* print complete error object
End If
Print ""
Print "WebSphere MQ Completion Code = " & MQSess.CompletionCode
Print "WebSphere MQ Reason Code = " & MQSess.ReasonCode
Print "(" & MQSess.ReasonName & ")"
End If
当使用外部事务处理协同器(如Microsoft 事务处理服务器)时。在这种情况下,事务处理由外部事务处理协同器的API 调用控制。简单说就是,Microsoft 事务处理服务器从本质上是本地和远程计算机上COM/ActiveX 组件的一个管理工具。
Microsoft 事务处理服务器一般与前端处理机代码(它是Microsoft 事务处理服务器中对象的COM 客户)一起使用,也同后端处理机服务(如数据库)一起使用。前端处理机代码可能是巨大的独立程序,也可能是基于因特网信息服务器的活动服务器页。前端处理机代码可能位于Microsoft 事务处理服务器及其商业对象所处的同一台机器上,并通过COM 相互连接。
前端处理器代码也可能位于另外一台机器上,通过DCOM 相连接。在不同的情况下,我们可以利用不同的客户机来访问相同的Microsoft 事务处理服务器商业对象。使用哪台客户机或者客户机如何连接到Microsoft 事务处理服务器不会对Microsoft事务处理服务器及其商业对象造成任何影响。客户机对象可能由任何语言在任何支持COM 客户机代码编写的环境中写成。最常见的是用于巨大客户机的Visual Basic和用于小客户机的VBScript 或JavaScript。商业对象可以由任何支持COM 服务器代码编写的语言写成。最常见的是Visual Basuc、C++和Java(Microsoft 的)。Microsoft 事务处理服务器被设计用来帮助用户在典型的中间层服务器上运行商业逻辑应用程序。它将工作分为活动,这些活动通常都是比较短的、独立的商业逻辑块。Microsoft 事务处理服务器推出了许多特性,能够简化可升级分布式应用程序的编写。在Windows2000 中又推出了称作COM+的新产品。该产品也是Microsoft 事务处理服务器的一个发展。
13.7 分组
WebSphere MQ Automation Classes for ActiveX 允许在一个消息组中包含一系列相关的消息,并作为一个消息组被发送。组环境信息与每个消息一起发送,使得消息系列可以被保存,对接收应用程序可用。组身份定义在消息描述器结构中,我们可以通过MQMessage 类来访问它.
除了最后一条消息具有MQMF_LAST_MSG_IN_GROUP 选项外,组中的每条消息都必须具备MQMF_MSG_IN_GROUP 选项。组中消息的顺序储存在MQMD 结构的MsgSeqNumber 字段中,它由队列管理器自动生成。
另外,队列管理器可以控制是否已完全接收消息组。如果只须显示完成的消息组的话,那么我们可以在获取消息选项结构中设置MQGMO_ALL_MSGS_AVAILABLE 选项。
13.8 本章小结
本章概括介绍MQSereis Automation Classes for ActiveX,讲解其定义,介绍我们能够如何利用其来处理WebSphere MQ 队列管理器对象。
13.9本章练习
1.使用WebSphere MQ automatin classes for ActiveX编写文件的发送程序。
2.使用WebSphere MQ automatin classes for ActiveX编写文件的接收程序。
ibmMQ-第十三章
最新推荐文章于 2021-02-16 00:42:49 发布