本节教程引导您简要地浏览 TestMessage 客户端应用程序的源代码。
有很多代码用于实现 Windows 接口,通过接口您可以发送、接收和查看消息。不过,教程的这一部分侧重于提供给 QAnywhere 的部分代码。
可以在 Samples\QAnywhere 中找到 TestMessage 源代码。
提供了多个版本的 TestMessage 源代码。以下版本用于 Windows 2000 和 Windows XP:
提供使用 Microsoft 基础类建立的 C++ 版本作为 Samples\QAnywhere\Windows\MFC\TestMessage\TestMessage.sln。
提供使用 .NET Framework 建立的 C# 版本作为 Samples\QAnywhere\Windows\.NET\CS\TestMessage\TestMessage.sln。
提供 Java 版本作为 Samples\QAnywhere\Java\TestMessage\TestMessage.java。
为 .NET Compact Framework 提供了以下版本:
提供在 .NET Compact Framework 上建立的 C# 版本作为 Samples\QAnywhere\Windows Mobile Classic\.NET\CS\TestMessage\TestMessage.sln。
需要 Visual Studio 2005 或更高版本才能打开解决方案文件并构建 .NET Framework 项目和 .NET Compact Framework 项目。
本节将引导您浏览 C# 源代码。这两个版本的结构非常相似。
本课不是让您查看应用程序中的每一行,而是重点介绍对理解 QAnywhere 应用程序很有帮助的某些行。将使用 C# 版本来演示这些行。
打开您感兴趣的 TestMessage 项目版本。
双击解决方案文件以在 Visual Studio 中打开项目。例如,Samples\QAnywhere\Windows\.NET\CS\TestMessage\TestMessage.sln 是解决方案文件。有多个解决方案文件用在不同的环境中。
确保打开了 [Solution Explorer]。
可以从 [View] 菜单中打开 [Solution Explorer]。
检查 [Source Files] 文件夹。
有两个文件特别重要。MessageList 文件 (MessageList.cs) 接收消息并允许您查看消息。NewMessage 文件 (NewMessage.cs) 允许您构造和发送消息。
从 [Solution Explorer] 中打开 MessageList 文件。
检查所包含的命名空间。
每个 QAnywhere 应用程序都需要 iAnywhere.QAnywhere.Client 命名空间。定义此命名空间的程序集作为 iAnywhere.QAnywhere.Client.dll DLL 提供。这些文件位于以下位置:
对于您自己的项目,编译时必须包括对此 DLL 的引用。在每个文件的顶部使用以下行包含该命名空间:
using iAnywhere.QAnywhere.Client; |
检查 startReceiver 方法。
此方法执行 QAnywhere 应用程序共有的初始化任务:
创建 QAManager 对象。
_qaManager = QAManagerFactory.Instance.CreateQAManager(); |
QAnywhere 提供了一个 QAManagerFactory 对象来创建 QAManager 对象。QAManager 对象处理 QAnywhere 消息传递操作:特别是接收消息(从队列中获取消息)和发送消息(将消息置于队列中)。
QAnywhere 提供了两种类型的管理器:QAManager 和 QATransactionalManager。当使用 QATransactionalManager 时,所有发送和接收操作都在一个事务内发生,以便要么发送(或接收)所有消息,要么都不发送(或都不接收)。
编写一个方法来处理消息。
onMessage() 方法由 QAnywhere 调用以处理常规非系统消息。它接收的消息被编码为 QAMessage 对象。QAMessage 类及其子类(QATextMessage 和 QABinaryMessage)提供保存 QAnywhere 应用程序所需的与消息相关的所有信息的属性和方法。
private void onMessage( QAMessage msg ) { Invoke( new onMessageDelegate( onMessageReceived ), new Object [] { msg } ); } |
该代码使用 Form 的 Invoke 方法,让运行基础窗口的线程来处理事件,以便用户界面可更新以显示消息。该线程也是创建 QAManager 的线程。在一些例外情况中,QAManager 只能从创建它的线程进行访问。
声明以 MessageList_Load 方法定义的 MessageListener。
_receiveListener = new QAManager.MessageListener( onMessage ); |
每当 QAnywhere 代理接收到一条消息并将其置于应用程序监听的队列中时,就会调用 OnMessage() 方法。
消息监听器与在使用推式通知进行消息传递的方案中描述的监听器组件不同。监听器组件接收通知,而消息监听器对象从队列中检索消息。
当您为队列设置一个消息监听器时,QAnywhere Manager 将把到达该队列的消息传递给该监听器。只能为一个给定的队列设置一个监听器。设置一个空监听器将清除该队列的所有监听器。
MessageListener 能够异步接收消息。您也可以同步接收信息,也就是说,应用程序显式地去队列中查找消息(可能是响应一个用户操作,如单击 [刷新] 按钮),而不是在消息出现时获得通知。
其它初始化任务包括:
打开并启动 QAManager 对象。
_qaManager.Open( AcknowledgementMode.EXPLICIT_ACKNOWLEDGEMENT ); _qaManager.Start(); |
AcknowledgementMode 枚举常量确定如何向发送者确认消息已接收。EXPLICIT_ACKNOWLEDGEMENT 常量指示直到调用一个 QAManager 确认方法时才确认消息。
装载在队列中等待的任何消息。
loadMessages(); |
将一个监听器指派给将来的消息队列。
该监听器在 MessageList_Load() 方法中声明。
_qaManager.SetMessageListener( _options.ReceiveQueueName, _receiveListener ); |
选项 ReceiveQueueName 属性包含字符串 testmessage,它是在 [TestMessage 选项] 窗口中设置的 TestMessage 队列。
在同一文件中检查 addMessage() 方法。
每当应用程序接收到消息时,就会调用此方法。它将获取消息的属性,例如消息的回复地址、首选名称和发送时间(时间戳),并在 TestMessage 用户界面中显示此信息。以下行将进来的消息转换为 QATextMessage 对象并获取消息的回复地址:
text_msg = ( QATextMessage )msg; from = text_msg.ReplyToAddress; |
这里简要分析了 MessageList 文件中的一些主要任务。
从 [Solution Explorer] 中打开 NewMessage 文件。
检查 sendMessage() 方法。
此方法获取在 [New Message] 窗口中输入的信息并构造一个 QATextMessage 对象。然后,QAManager 将该消息置于要发送的队列中。
下面的行用于创建一个 QATextMessage 对象并设置它的 ReplyToAddress 属性:
qa_manager = MessageList.GetQAManager(); msg = qa_manager.CreateTextMessage(); msg.ReplyToAddress = MessageList.getOptions().ReceiveQueueName; |
下面的行用于将消息置于要发送的队列中。变量 dest
为目标地址,将作为参数提供给函数。
qa_manager.PutMessage( dest, msg ); |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |