JAX-WS:动态提供者

时间:2012-07-12 09:10:26

标签: java jax-ws

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

请阅读Oracle的this article以获取想法......

然后点击JBoss BPEL user guide

在您的情况下应该如何使用BPEL

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

有了这个,您将拥有一个非常强大的业务流程平台,您可以在将来扩展它以用于更复杂的用例。

希望它有所帮助...

答案 1 :(得分: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服务。

这只是我的想法。你需要建立在此之上。