3

我有一个环境,它承载了许多带有输入和输出的“服务”,这些输入和输出很容易绑定到 XML。我希望能够通过 SOAP 动态公开一项或多项服务。换句话说,用户必须能够将服务 A 和 B 组合成一个 Web 服务(并且可以选择为操作配置名称等)。

这意味着我需要能够动态生成 W​​SDL 或至少其中的一部分(尤其是可以从服务请求的 XSD 定义),并且我需要能够动态创建和发布都使用单个 Provider 的新端点哪个类(基于上下文和其他)将确定您尝试调用的服务。它将解组 XML、调用服务、编组响应并将其发回。

这对 JAX-WS 可行吗?我非常想利用 JAX-WS 附带的现有功能(尤其是 WS-* 等)。如果 JAX-WS 无法实现,还有其他选择吗?

4

2 回答 2

2

您的用例实际上很难用 JAX-WS 实现(甚至可能是不可能的)。但别担心,你不是第一个有这个要求的人。

想象一家大公司有几个需要集成的遗留系统。然后他们花费了大量金钱和时间来实现基于 SOAP Web 服务的 SOA 架构。这些服务被组合(编排)以创建业务流程。

示例: “创建合同”业务流程需要执行 Web 服务 A、B 和 C。

但是如果更改业务流程需要更改一些代码源会怎样???公司需要有一个开发团队来保持这些流程的最新状态。

为了解决这个问题,创建了BPEL 的动态绑定。该技术允许您在运行时根据所请求服务的参数组合新服务!

简而言之,如果定义多个“基本 Web 服务”,然后配置一个 BPEL 服务器以在运行时动态组合这些服务,您需要做什么!

请阅读Oracle 的这篇文章以了解...

并在此处查看JBoss BPEL 用户指南

在您的案例中使用 BPEL 应该怎么做

  • 为每个非 SOAP 服务创建 SOAP 一个 Web 服务(让我们称之为“基础 Web 服务”)。
  • 配置 BPEL 引擎以编排“基础 Web 服务”的组合/组合。
  • 创建能够使用 BPEL 端点在运行时(如果需要,根据每个请求)组合/组合“基本 Web 服务”的客户端。注意:这不需要更改 BPEL 引擎配置

有了这个,您将拥有一个非常强大的平台来进行编排,您可以在未来为更复杂的用例进行扩展。

希望能帮助到你 ...

于 2012-07-15T20:06:36.483 回答
1

一种好方法是使用 CDM 作为您的有效负载结构。在 CDM(通用数据模型)中,您定义可以吸收任何 XML 类型的可扩展模式。

常规 XML:

<dataset> 
            <BillingAddress>
                 <set>
                     <po-box >22224<po-box>
                     <suburb   code="2009">Pyrmont</suburb>
                     <city  >Sydney</city>
                     <country  code="AU">Australia</country>
                </set>
            </BillingAddress>
            <OfficeAddress>
                 <set>
                      <street >2/73 Union St</street>
                     <suburb   code="2009">Pyrmont</suburb>
                     <city  >Sydney</city>
                     <country   code="AU">Australia</country>
               </set>
            </OfficeAddress> 
</dataset>

公共数据模型 XML:

<objects>
  <object is="Address">
       <set>
             <text is="suburb"  code="2009">Pyrmont</text>
             <text is="city">Sydney</text>
             <text is="country" code="AU">Australia</text>

            <object is="BillingAddress">
                 <set>
                     <text is="po-box.billing">22224<text>
                     <text is="suburb.billing" code="2009">Pyrmont</text>
                     <text is="city.billing">Sydney</text>
                     <text is="country.billing" code="AU">Australia</text>
                </set>
            </object>
            <object is="OfficeAddress">
                 <set>
                      <text is="street.office">2/73 Union St<text>
                     <text is="suburb.office"  code="2009">Pyrmont</text>
                     <text is="city.office">Sydney</text>
                     <text is="country.office" code="AU">Australia</text>
               </set>
            </object>
         </set>
    </object>
</objects>

主服务可以采用 CDM 并基于 XML 中的某个标志,它可以将请求路由到适当的 Web 服务。

这只是我的想法。您需要在此基础上进行构建。

于 2012-07-17T08:14:56.367 回答