2

这是对该场景的描述,我也将不胜感激对所用方法的任何评论

我的应用程序的核心是一组由 P2P 数据库支持的 Web 服务。一个服务接受一个简单的基于 XML 的记录(我已经为它设计了一个通用模式)。服务处理这些数据(主要是根据某些标准创建密钥)并将原始数据与创建的密钥一起传递给侦听 P2P 节点之一中的侦听 SocketServer。这个键、数据对被路由到适当的节点,该节点将数据(与作为 ID 的键关联)存储在 XML 数据库中。

第二个服务接受基于相同模式构造的查询文档,但具有可选值,用于从先前存储的搜索和匹配。所以第二个服务会将这个查询(使用正确的键)传递给 P2P 部分,取回结果并将它们传递回服务客户端。

例如,如果提交给第一个服务的原始记录是 <attr1>value1</attr1><attr2>value2</attr2>(属性列表以及模式要求的一些其他元数据),那么第二个服务应该检索该记录,如果收到的查询是 <attr2>value2</attr2>

(我以后可以考虑使用更复杂的 XPath 或 XQuery 查询,因为底层 XML 数据库允许,而不是此处的值完全匹配,但这在现阶段并不重要。我还在处理第三个服务,但这取决于获取前两个形状正确)

所以我的问题是:

1) 我应该使用什么数据类型作为 Web 服务的参数?如何将我的模式用于此用途?我为此考虑了各种 XML 绑定框架(尤其是 JAXB 和 SDO),但不知道如何进行。

2) 如何增强这两个服务(将它们称为存储和搜索)以使用基于原始通用模式的动态创建的模板?该服务仍将接受主要模式类型的文档,但具有基于模板的内部属性列表,例如 template1 只需要其值是整数,而 template2 需要 (float) 和 (string)。当前基于 JSP 的原型手动创建此模板,但作为手动组装的 XML 文档(<>标签分散在文本中)并且没有类型检查,所以我认为我可以做得更好!

3) 是否可以生成一个快速的 Web 应用程序原型以简单地访问该系统(再次通过使用模式(&模板)编辑适当的 XML 消息结构?我正在寻找的是让(人类)用户选择一个模板,然后只需“填空”并提交,无需任何花哨的外观和感觉。

4) 我能否或如何使用这种 XML 消息类型跨套接字进行通信?

5) 我是否将服务部署为无状态 EJB 是否重要?我需要它们成为 EJB 还是 servlet 就足够了?

我目前有一个基本实现(来自以前的开发人员),用于我当前需求的一个子集(我正在改进服务并添加新的派生服务),但是没有架构或验证,并且数据一直作为基本的传递字符串,从而提供弱类型和难以更新手动解析。我想将其更新为更强的绑定类型的原因是在数据模式中引入更改,这些更改将很容易在整个系统中传递。基本上我希望系统尽可能少地与使用的数据格式/模式耦合;当前的原型与数据过于耦合,我发现在不破坏系统的情况下更改数据非常困难。

我最初的调查使我考虑了 JAXB,但它仅支持静态类型(无法在运行时动态创建模式/类型,我希望保留以供以后使用)。所以我遇到了同时具有动态和静态类型的 SDO。问题只是没有足够的社区和/或使用这种方法的例子,所以它似乎有风险(Apache Tuscany 和 Eclipselink 实现的例子非常稀缺,我找不到 5 年以上的完整例子(比如这个http://www.ibm.com/developerworks/java/library/j-sdo/)并且还解决了 SDO 的 XML 用例(大多数似乎集中在 SDO 的关系使用上)。

这是我第一次(在这里和其他地方)寻求编程帮助,所以请多多包涵。我在网上搜索了很多,但我找不到任何有用的东西,但这里和那里没有加起来的部分。

任何评论或提示都非常感谢。

trfndr

编辑

我忘了一件事:搜索服务如何取回结果?由于它正在打开客户端套接字连接,因此无法同步返回任何结果。当前的实现通过让服务客户端在随机端口上打开侦听套接字并将此联系信息放入查询文档中来解决此问题。在搜索 Web 服务将查询发送到 p2p 部分后,它就完成了。p2p 将结果作为 WS 调用发送到另一个服务,该服务将它们发送回服务客户端套接字。我不太喜欢这种方法,有没有更优雅的解决方案?

4

1 回答 1

0

我领导 EclipseLink JAXB 和 SDO 实现,并代表 Oracle 处理这些规范,因此希望我能帮助您。这个问题与我 9 月份在 JavaOne 上的演讲非常相似。

1) 我应该使用什么数据类型作为 Web 服务的参数?如何将我的模式用于此用途?我为此考虑了各种 XML 绑定框架(尤其是 JAXB 和 SDO),但不知道如何进行。

这取决于您使用的 Web 服务框架。JAXB 更容易与 JAX-WS 一起使用,虽然 JAXB 仍然更容易与 JAX-RS SDO 一起使用,但它是一种可能的替代方案。

2) 如何增强这两个服务(将它们称为存储和搜索)以使用基于原始通用模式的动态创建的模板?该服务仍将接受主要模式类型的文档,但具有基于模板的内部属性列表,例如 template1 只需要其值是整数,而 template2 需要 (float) 和 (string)。当前基于 JSP 的原型手动创建了这个模板,但是作为一个手动组装的 XML 文档(<>标签分散在文本中)并且没有任何类型检查,所以我认为我可以做得更好!

我不是 100% 的意思,但以下内容可能会有所帮助:

3) 是否可以生成一个快速的 Web 应用程序原型以简单地访问该系统(再次通过使用模式(&模板)编辑适当的 XML 消息结构?我正在寻找的是让(人类)用户选择一个模板,然后只需“填空”并提交,无需任何花哨的外观和感觉。

JAX-RS 是一个很好的创建快速原型的框架。下面是我创建的一个示例:

4) 我能否或如何使用这种 XML 消息类型跨套接字进行通信?

我更喜欢像 JAX-RS 这样通过 HTTP 协议进行通信的框架。

5) 我是否将服务部署为无状态 EJB 是否重要?我需要它们成为 EJB 还是 servlet 就足够了?

我的偏好是为服务使用 EJB 会话 bean。如果您正在与数据库交互,那么您可以利用 Java Transaction API (JTA) 来管理您的数据库事务。

SDO

EclipseLink 是SDO 2.1.1 (JSR-235)参考实现。我们在下面发布了一些示例。如果您正在寻找如何做一些具体的事情,我会尝试发布一个相关的例子。

JAXB

JAXB 是静态的。它也比 SDO 更受欢迎。在 EclipseLink 中认识到这一点,我们实现了一个动态 JAXB 特性。它通过 JAXB 倾斜为您提供了 SDO 的动态方面。

编辑#1

由于您正在处理 JAX-WS 并且您的模型几乎是完全动态的,因此我认为您应该完全跳过 JAXB 绑定。在以下链接中,请参阅“关闭数据绑定”部分

这将为我们提供作为 javax.xml.transform.Source 对象的消息主体。我们需要根据动态模板处理 XML。SDO 将是一个不错的选择。您可以使用 XML 模式不断地向 HelperContext 添加新类型。

helperContext.getXSDHelper().define(schema1, null);
helperContext.getXSDHelper().define(schema2, null);

您将能够从 Web 服务中解组 Source,如下所示:

XMLDocument doc = helperContext.getXMLHelper().load(source, null, null);
DataObject rootDataObject = doc.getRootObject();
String someValue = rootDataObject.getString("attr3/childAttr/anotherChildAttr");

在调用另一个服务时,您还可以使用 XMLHelper 将您的对象编组为 XML。

于 2010-09-01T14:21:27.363 回答