在JBoss SOA上发布自定义Web服务

时间:2011-02-07 18:22:38

标签: java jboss wsdl

我正在使用它,目前我在JBoss Soa 5中配置并运行了两个Web服务端点,并且在ESB标准中,每个端点都作为单独的操作发布。

交易提交的一个终点:

<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服务中发布这两个操作,将流重定向到已定义的服务ErrorsSubmit和{ {1}}。

可以这样做吗?

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

几周后我就能找到办法。默认情况下,没有可配置的方法从WS操作重定向到ESB服务,但您可以通过编程方式执行此操作。

这是WS-operation:

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;
}