2011-02-07 53 views
4

我在这里遇到了一堵墙,目前我有两个在JBoss Soa 5中配置并运行的Web服务端点,并且和ESB标准一样,每个端点都作为单独的操作发布。在JBoss SOA上发布自定义web服务

一端点为交易提交:

<service description="writes Transactions to DB." name="TransactionsSubmit"> 
     <listeners> 
     <jms-listener busidref="transactionSubmitChannel" name="transactionSubmit" /> 
      </listeners> 
    <actions faultXsd="/resources/xsd/transactions-fault.xsd" 
     inXsd="/resources/xsd/ws-submit-trx.xsd" 
     mep="RequestResponse" 
     outXsd="/resources/xsd/ws-trx-response.xsd">     
     <action  class="org.timo.service.SubmitTransaction"> 
     </action> 
    </actions> 
</service> 

和其他错误提交:

<service description="writes errors to DB." name="ErrorsSubmit"> 
     <listeners> 
     <jms-listener busidref="errorSubmitChannel" name="errorSubmit" /> 
      </listeners> 
    <actions faultXsd="/resources/xsd/transactions-fault.xsd" 
     inXsd="/resources/xsd/ws-errorsubmit-trx.xsd" 
     mep="RequestResponse" 
     outXsd="/resources/xsd/ws-errorsubmit-response.xsd">     
     <action  class="org.timo.service.SubmitError"> 
     </action> 
    </actions> 
</service> 

我想要做的就是用我自己的WSDL文件来创建自定义Web服务在单个proxy服务中发布这两个操作,将这些流重定向到已定义的服务ErrorsSubmitTransactionsSubmit

可以这样做吗?

注意:我可以通过向ESB包添加WAR应用程序来部署自己的WSDL服务,但我无法将流重定向到内部服务。

回答

0

几个星期后,我可以找到办法。默认情况下,不存在从WS操作重定向到ESB服务的可配置方式,但可以通过编程方式执行。

这是WS-操作:

public Response submitTransaction(final TransactionRequest request) throws CommonFault { 
     log.info("submitTransaction : "+ request.getId()); 
     JAXBElement<TransactionResponse> response = invokeService("TransactionsSubmit", objectFactory.createSubmitTransactionRequest(request)); 
     return response.getValue(); 
    } 


private <T> JAXBElement<T> invokeService(final String serviceName, final JAXBElement<?> request) { 
     log.info("Invoking service : " + serviceName + "()"); 
     JAXBElement<T> response = null; 
     try { 
      ServiceInvoker serviceInvoker = new ServiceInvoker("myservice", serviceName); 
      Message message = org.jboss.soa.esb.message.format.MessageFactory.getInstance().getMessage(); 

      message.getBody().add(jaxbHandler.serialize(request)); 
      Message esbResponse = serviceInvoker.deliverSync(message, 5000); 
      log.info("Response : " + esbResponse.getBody().get().toString()); 

      response = deserialize(esbResponse.getBody().get().toString()); 
     } catch (Exception e) { 
      log.error(e, e); 
     } 
     return response; 
} 
0

我相信你所需要的只是一个基于内容的肥皂客户端路由器。

+0

能否请您解释一下好(我用简短的回答很慢)。我所做的(并且它的工作原理)是创建一个代理Web服务,它通过在运行时创建SOAP请求(使用Java SOAPMessage本机组件)来调用ESB服务。我接近你的方法吗? –