分享
 
 
 

实现数据资源层中的异步互用性

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

简介

实现异步互用性是第 1 章“简介”中所介绍的第三个互用性场景,其中包括从 .NET Framework 组件到数据层中消息队列组件的连接。异步互用性包括希望客户端应用程序能够调用另一个层或进程的情况。通过调用,客户端可在远程组件处理请求的同时继续进行操作,而不是等待结果。

使用异步操作只对针对这种操作样式的任务有意义。在 XBikes 应用程序示例中,订单处理是使用消息队列的较好范例,并且推荐为适用于消费者电子商务应用程序业务的最佳做法。

本章主要关注于到 IBM WebSphere MQ 的连接。另一节描述了 Microsoft Host Integration Server (HIS) 附带的 MSMQ-MQSeries 桥,并在 Microsoft 消息队列 (MSMQ) 和 IBM WebSphere MQ (通常称为 MQSeries)之间提供桥接。

有关 JNBridgePro 的小节中描述了如何生成桥接 .NET Framework 业务层组件和 WebSphere MQ 间连接的 Java 代理程序集。本章的最后部分使用 Ja.NET 来展示相同的技术。

确定数据交换格式和数据类型

如同使用其它互用性技术一样,首先必须确定 .NET Framework 和 Java 都可接受的数据格式。该选择取决于以下因素:

• 如何与消息队列集成?

• 使用桥接产品来包装消息队列功能吗?

• 使用 MSMQ-MQSeries 桥吗?

数据交换格式和数据类型的选择取决于使用的互用性集成技术:

• 如果使用其中一种桥接产品来包装消息队列功能,则可能需要使用与点对点通讯中所用相同的数据交换格式和数据类型。

• 如果使用 MSMQ-MQSeries 桥,则必须执行与 Web 服务相似的策略。为了允许从消息队列读取对象和向其写入对象,必须将这些 XML 文档序列化成字符串。XML 格式的字符串可保留 .NET Framework 或 Java 对象中包含的丰富信息,并能够克服交换实际对象时出现的互用性难题。

本章就这些选项分别进行了说明。

设计和构建服务接口

将消息队列用于异步互用性时,不能跨越技术边界直接调用服务接口。服务接口的角色更像“消息使用者”。该服务接口是一个应用程序,负责监视并从队列获取消息、打开数据包并将其发送到现有的外观或处理该消息的应用程序。

.NET Framework 和 J2EE 都提供从消息(.NET Framework 中的队列组件和 J2EE 中由消息驱动的 bean)激活组件的内建支持。然而,每种情况就所需消息的结构各有不同,因此在 .NET Framework 和 J2EE 间需要互用性时,该方法不可行。可自己编写服务接口以使用消息,并将它们传递给合适的服务外观。

建立消息使用者非常容易。无论使用哪种技术编写该消息,使用消息的技术是相同的。需要创建客户端应用程序或服务来轮询队列上的消息并读取所有找到的消息。从消息中提取的数据或者已经是以正确格式(如果它使用的是桥接技术)表示,或者需要用第 7 和第 8 章所述的 Web 服务技术从 XML 字符串反序列化为正确的数据类。

图 9.1 显示了异步通讯中服务接口的角色。

图 9.1:异步通讯中服务接口的角色

将数据返回到正确格式后,需要做的就是对适当的服务外观进行方法调用。

设计和构建异步互用性适配器

构建异步互用性适配器类似于构建同步适配器,除了将消息放入消息队列中,而不是调用正确的服务接口。此外,根据使用的技术,可能必须操作数据,将其转化成 Java 数据代理或序列化为 XML 字符串。

图 9.2 显示了异步通讯中互用性适配器的角色。

图 9.2:异步通讯中互用性适配器的角色

消息加入消息队列的方式取决于所用的技术。对于包装 JMS 功能的桥接产品,可以使用 ObjectMessage 类型将消息放入队列中,否则必须使用基于文本的消息类型。

使用 MSMQ-MQSeries 桥

如果熟悉从 .NET Framework 写入 MSMQ 的消息代码,并且具有编写 JMS 代码以使用 WebSphere MQ 的经验,则使用 MSMQ-MQSeries 桥来实现互用性比较简便。

MSMQ-MQSeries 桥要求两台计算机,第一台的配置如下:

• Windows 2000 或 Windows 2003

• Active Directory

• MSMQ-MQSeries Bridge

• MSMQ (带路由支持)

• WebSphere MQ 客户端

第二台计算机应该安装 Windows 2000,作为成员服务器并运行 WebSphere MQ。

需要将运行 WebSphere MQ 的计算机配置为 MSMQ 中的外部计算机。通过在 Active Directory 站点和服务中的 Services/MsmqServices 节点下创建外部站点来完成此任务,添加新的 MSMQ 路由链接以将本地站点(通常为默认的第一个站点的名称)链接到外部站点,添加该 MSMQ 计算机作为本地站点网关,然后添加 MQ Series 计算机作为到外部站点的外部计算机。

有关配置 MSMQ 外部站点的详细信息,请参阅 TechNet 上的“Configuring cross-platform messaging”。

有关配置和使用 MSMQ-MQSeries 桥的详细信息,请参阅 TechNet 上的“Chapter 13 MSMQ-MQSeries Bridge Configuration Guide”。

考虑使用 JMS 读取 WebSphere MQ 消息的情况。最初,这些消息来自 MSMQ 并通过桥接传递。在本例中,如果更改 WebSphere MQ JMS 配置,应该不会出现消息使用问题。为了实现这个互用性场景,将 WebSphere MQ 的 targetClient 队列配置设置为 MQ,而不是 JMS。如果不做此更改,则 WebSphere MQ 会预期获得 .NET Framework 无法生成的 JMS 头消息。

注 在现有队列上不要配置 targetClient,因为更改可能会导致现有 JMS 应用程序失败。始终为互用性创建专用的新消息队列。

反之,如果将 targetClient 更改为 MQ,则可从 JMS 生成消息,随后通过桥接传递它们并在 .NET Framework 应用程序中进行使用。

配置消息队列

为了通过 MSMQ-MQSeries 桥实现互用性,需要为消息发送的每个方向创建两个队列。需要为接收消息定义本地队列以及为发送消息定义远程队列。还必须正确配置桥接。

图 9.3 显示了如何在 .NET Framework 和 Java 间希望发送消息的每个方向上设置两个队列。

图 9.3:连接 MSMQ 和 MQ Series 的 MSMQ-MQSeries 桥的逻辑表示

从定义 MSMQ 队列开始。向运行桥接的计算机添加本地队列,向外部计算机添加远程队列。

其次,使用 MSMQ-MQSeries 桥管理器,添加指向运行 WebSphere MQ 的计算机的 MQI 通道。这会创建四个消息管道(两个事务性和两个非事务性)在两个队列系统间路由消息。创建完成之后,需要公开客户端和服务器的定义。将这些文件复制到 WebSphere MQ 计算机,然后使用 runmqsc 命令将它们导入。这个命令配置传输队列并跨越桥接保持信道的同步。

下一步是在 WebSphere MQ 中创建本地和远程队列。通过桥接配置远程队列以指向 MSMQ 队列。通过配置远程队列管理器名和传输队列名以指向导入创建的对象来完成此操作。

最后,需要从运行 WebSphere MQ 的计算机将 WebSphere MQ 客户端通道表文件复制到 MSMQ 计算机,并配置 MQCHLLIB 和 MQCHLTAB 环境变量以指向该文件。

选择数据格式

使用 MSMQ-MQSeries 桥发送队列上的消息时,必须确保接收端可以使用该消息数据。在 J2EE 和 .NET Framework 间发送复杂数据的唯一现实的方法是将数据序列化成 XML 格式的字符串。此外,WebSphere MQ 支持发送 TextMessages,可以加载带有包含要发送的 XML 数据的字符串的正文。MSMQ 还允许发送包含 XML 格式字符串的简单消息。

注 使用其它的数据类型不可行,因为如同第 3 章“互用性基本原理”中所述,在 .NET Framework 和 J2EE 间存在二进制序列化差异。

创建消息使用者

本指南已说明了为什么消息使用者是一个应用程序,可创建以用于轮询并读取队列中的消息,并将它们放在资源外观中。因为使用的是桥接,所以使用 XML 格式的字符串。因此,在能够使用数据调用资源外观上的方法之前,必须从 XML 字符串中重建数据。随后两节介绍了如何在两个平台上完成此操作。

创建 .NET Framework 消息使用者

如同第 5 章“互用性技术:数据层”所述,.NET Framework 消息使用者从 MSMQ 队列读取消息。读取消息内容之后,必须重建数据。有关完成此操作的技术的信息,请参阅第 7 章“在表示层集成 .NET”中的“Web 服务”一节。

下列代码示例显示了如何从 MSMQ 读取消息,以及用于构建正确 .NET Framework 数据类型的数据。

MessageQueue q = new MessageQueue(_queueName);

q.Formatter = new XmlMessageFormatter( new Type[] {typeof(String)} );

Message order = q.Receive(0);

string xml = (string) order.Body();

StringReader sr = new StringReader(xml);

OrderData ds = new OrderData();

// Load result string back into an OrderData-typed DataSet

ds.ReadXml(sr);

注 前面的示例使用来自 XBikes 的 OrderData 自定义数据类型。然而,XBikes 应用程序不实现该代码。

创建 J2EE 消息使用者

J2EE 消息使用者从 WebSphere MQ 读取消

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有