2011-02-07 5 views
4

Je suis sur un mur avec ceci, actuellement j'ai deux points de terminaison de service Web configurés et fonctionnant dans JBoss Soa 5 et comme dans la norme ESB chaque point de terminaison est publié comme une opération individuelle.Publier un service web personnalisé sur JBoss SOA

Un point final pour la soumission de la transaction:

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

et d'autres pour la soumission d'erreur:

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

Ce que je veux faire est de créer un service Web personnalisé à l'aide de mon propre fichier WSDL publier ces deux opérations dans un seul service proxy redirigeant les flux vers les services déjà définis ErrorsSubmit et TransactionsSubmit.

Est-ce possible?

Remarque: Je pouvais déployer mon propre service WSDL en ajoutant une application WAR au package ESB, mais je ne peux pas rediriger le flux vers les services internes.

Répondre

0

Après plusieurs semaines, j'ai pu trouver le moyen de le faire. Par défaut, il n'existe pas de moyen configurable de redirection d'une opération WS vers un service ESB, mais vous pouvez le faire par programmation.

C'est le WS-opération:

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

Je crois que tout ce dont vous avez besoin est un routeur basé sur le contenu avec des clients soap.

+0

Pourriez-vous s'il vous plaît expliquer mieux (je suis assez lent avec des réponses courtes). Ce que j'ai fait (et cela fonctionne) était de créer un service web proxy qui appelle les services ESB en créant des requêtes SOAP en exécution (en utilisant les composants natifs java SOAPMessage). Suis-je proche de votre approche? –

Questions connexes