2011-02-07 12 views
4

私は現在、JBoss Soa 5で2つの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> 

及びその他:

1つのトランザクションの提出のためのエンドポイント

<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サービスを作成することですこれら2つの操作を単一のproxyサービスに公開して、フローを既に定義されたサービスErrorsSubmitTransactionsSubmitにリダイレクトします。

これは可能ですか?

注:WARアプリケーションをESBパッケージに追加することで独自の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

あなたは(私は短い答えとはかなり遅いよ)良いことを説明してもらえます。私がやったことは、(Java SOAPMessageネイティブコンポーネントを使って)実行時にSOAPリクエストを作成してESBサービスを呼び出すプロキシWebサービスを作成することでした。私はあなたのアプローチに近いですか? –

関連する問題