【问题标题】:JAX-WS: Dynamic ProvidersJAX-WS:动态提供者
【发布时间】:2012-07-17 16:14:56
【问题描述】:

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

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

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

【问题讨论】:

    标签: java jax-ws


    【解决方案1】:

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

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

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

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

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

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

    请阅读 Oracle 的this article 以了解...

    并在此处查看JBoss BPEL user guide

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

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

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

    希望对你有帮助...

    【讨论】:

    • 据我了解,BPEL 确实是一个编排引擎,用于使用 Web 服务创建业务流。然而,业务流程已经存在于服务中,我只需要通过 SOAP 公开所述业务流程的“根”服务,以便它们可以在外部触发。此外,上述网络服务的创建和管理必须完全编程。
    • BPEL 可以具有预先固定的工作流(如您所述)或基于动态绑定的动态工作流。最后一个允许根据请求更改工作流程。现在,更改工作流程 意味着在运行时组合不同的“基础”Web 服务(这是您需要的,对吧?)。对于 BPEL 服务的客户端,它将调用单个“根”SOAP Web 服务(实际上,客户端不会知道正在执行 BPEL 工作流)。
    • BPEL 唯一没有为您提供的是“完全程序化”的根 Web 服务。但我不明白您为什么需要它:您可以用 JAX-WS 做任何事情,而您不能用 BPEL 工作流的 XML 描述符做任何事情(关于您的用例)。我强烈建议您在尝试自己重新发明 BPEL 引擎之前阅读有关 BPEL 的更多信息(并对其进行测试!),因为满足您的需求是为...创建 BPEL 的原因。
    • 我不完全确定我理解在这种情况下使用 BPEL。我有一个功能齐全的服务,其端点在 XSD 中描述,并且具有可以轻松编组为 XML 的输入/输出。我唯一需要添加的是一些 SOAP 处理,最好使用一些简洁的 WS-* 选项。 BPEL 做的远不止这些,不是吗?
    • 我需要编程接口,因为用户必须通过我们的系统来设置 Web 服务,而不是通过外部工具或配置文件。它需要与系统的其余部分集成。
    【解决方案2】:

    一种好方法是使用 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 服务。

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

    【讨论】:

    • 某些服务实际上处理 CDM :) 无法包装某些输入/输出,因为它们是为非常特定的目标而设计的。它们必须保持原样并通过 SOAP 简单地公开。
    猜你喜欢
    • 1970-01-01
    • 2014-11-27
    • 2019-05-30
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    相关资源
    最近更新 更多