Développement d'un client dynamique à l'aide d'API JAX-WS

JAX-WS (Java™ API for XML-Based Web Services) fournit le support de l'appel dynamique des opérations du noeud final de service.

Pourquoi et quand exécuter cette tâche

JAX-WS fournit une nouvelle API dynamique de client Dispatch plus générique et offrant davantage de flexibilité que l'interface existante DII (Dynamic Invocation Interface) basée JAX-RPC (Java API for XML-based RPC). L'interface client Dispatch, javax.xml.ws.Dispatch, est un client orienté messagerie XML conçu pour les développeurs XML avancés préférant travailler au niveau XML à l'aide de constructions XML. Pour écrire un client Dispatch, vous devez avoir des compétences en matière d'API de client Dispatch et de types d'objets pris en charge, ainsi que des connaissances des représentations de message pour le fichier WSDL (Services Description Language) Web associé.

L'API Dispatch peut envoyer des données en mode PAYLOAD ou MESSAGE. En mode PAYLOAD, le client Dispatch n'est responsable que de la fourniture du contenu de l'élément <soap:Body> et JAX-WS inclut la charge d'entrée dans un élément <soap:Envelope>. En mode MESSAGE, le client Dispatch est chargé de fournir la totalité de l'enveloppe SOAP.

L'API de client Dispatch exige que les clients d'application construisent des messages ou des charges sous forme XML et nécessite des connaissances détaillées du message ou de la charge du message. Le client Dispatch peut utiliser les liaisons HTTP lorsqu'il utilise les objets source, les objets JAXB (Java Architecture for XML Binding) ou les objets de source de données. Le client Dispatch prend en charge les types d'objets suivants :
  • javax.xml.transform.Source : Les objets Source permettent aux clients d'utiliser directement des API XML. Vous pouvez utiliser les objets Source avec des liaisons SOAP et HTTP.
  • Objets JAXB : utilisez les objets JAXB pour que les clients puissent se servir des objets JAXB qui sont générés à partir d'un schéma XML pour créer et manipuler XML à l'aide d'applications JAX-WS. Les objets JAXB ne peuvent être utilisés qu'avec les liaisons SOAP ou HTTP.
  • javax.xml.soap.SOAPMessage : utilisez les objets SOAPMessage pour que les clients puissent travailler avec les messages SOAP. Vous pouvez utiliser les objets SOAPMessage uniquement avec les liaisons SOAP version 1.1 ou SOAP version 1.2.
  • javax.activation.DataSource : utilisez les objets DataSource de sorte que les clients puissent travailler avec les messages MIME (Multipurpose Internet Mail Extension). Les objets DataSource ne peuvent être utilisés qu'avec les liaisons HTTP.
L'API Dispatch utilise le concept de génériques qui sont introduits dans JRE (Java SE Runtime Environment) 6. Pour chaque méthode invoke() sur l'interface Dispatch, les éléments génériques permettent de déterminer le type de retour.

Procédure

  1. Déterminez si vous souhaitez que votre client dynamique envoie des données en mode PAYLOAD ou MESSAGE.
  2. Créez une instance de service et ajoutez-y au moins un port. Le port inclut les informations d'adresse de noeud final de service et de liaison de protocole.
  3. Créez un objet Dispatch<T> à l'aide de la méthode Service.Mode.PAYLOAD ou de la méthode Service.Mode.MESSAGE.
  4. Configurez les propriétés de contexte de demande sur l'interface javax.xml.ws.BindingProvider. Utilisez le contexte de demande afin de spécifier des propriétés supplémentaires, telles l'activation de l'authentification HTTP ou la spécification de l'adresse de noeud final.
  5. Facultatif : Affectez à la propriété jaxws.response.throwExceptionIfSOAPFault de l'option RequestContext de l'API Dispatch la valeur Boolean.TRUE, pour ne pas que l'environnement d'exécution JAX-WS émette une erreur SOAPFaultException.

    L'exemple suivant illustre la façon de spécifier cette propriété pour l'option RequestContext de l'API Dispatch.

    Dispatch<OMElement> dispatch = service.createDispatch( 
    portName, OMElement.class, Mode.MESSAGE);  
    BindingProvider bp = (BindingProvider)dispatch; 
    bp.getRequestContext().put(   
    "jaxws.response.throwExceptionIfSOAPFault", Boolean.FALSE);  
  6. Composez le message de demande client pour le client dynamique.
  7. Appelez le noeud final de service avec le client Dispatch, de manière synchrone ou asynchrone.
  8. Traitez le message de réponse à partir du service.

Résultats

Vous avez développé un client JAX-WS dynamique à l'aide de l'API Dispatch. Pour plus d'informations sur l'utilisation d'un client Dispatch, consultez le chapitre 4, section 3 de la spécification JAX-WS 2.0.

Les ports dynamiques JAX-WS, qui sont ceux qui ont été ajoutés à l'aide de la méthode de service addPort, peuvent avoir des demandes de mémoire supplémentaires à partir de la WebSphere Application Server Version 8.0. Dans les éditions précédentes, une instance unique d'un port dynamique peut être partagée sur plusieurs instances de service. Dans la version 8.x, les ports dynamiques sont dorénavant utilisés par l'instance du service qui les a ajoutés. Si un client JAX-WS a plusieurs instances de service se rapportant à un port dynamique du même nom, ces instances ne sont plus partagées. Ceci peut éventuellement accroître les exigences de mémoire de ce client. La mémoire utilisée par les ports dynamiques est libérée lorsque l'instance du service est hors portée. Toutefois, si vous rencontrez des problèmes liés à l'augmentation de l'utilisation de la mémoire, il est possible de revenir au comportement avec lequel les ports dynamiques sont à nouveau partagés sur les instances de service. Pour ce faire, paramétrez la propriété système jaxws.share.dynamic.ports.enable sur la valeur true. Toutefois, cette opération peut entraîner d'autres incidents, par exemple l'application incorrecte des ensembles de règles sur les ports dynamiques partagés. Si vous définissez cet indicateur sur true et rencontrez certains de ces incidents, supprimez le paramètre d'indicateur.

Dans les éditions précédentes, si une action SOAP n'était pas fournie par l'application client Dispatch, l'action SOAP correcte n'était pas envoyée sur le message sortant. A la place, l'action SOAP était définie sur une opération anonyme. Depuis la WebSphere Application Server Version 8, si l'action SOAP n'est pas fournie par l'application client Dispatch, l'environnement d'exécution JAX-WS analyse le message sortant. Il détermine l'opération appelée et utilise ces informations pour déterminer la valeur appropriée de l'action SOAP. La résolution de l'opération du message sortant est basée sur le corps SOAP et le chiffrement du message, par exemple, Doc/Lit/Bare, Doc/Lit/Wrapped. Cette analyse pouvant être chère, une propriété peut être définie. Pour toujours désactiver l'analyse, définissez la propriété au niveau du système. Pour désactiver l'analyse sur la base d'un message individuel, définissez la propriété sur le contexte de message de la demande JAX-WS. La propriété est définie en org.apache.axis2.jaxws.Constants.DISPATCH_CLIENT_OUTBOUND_RESOLUTION constante avec une valeur de chaîne de jaxws.dispatch.outbound.operation.resolution.enable. La valeur par défaut de la propriété est null, ce qui est interprété en chaîne true, qui active la résolution de l'opération sortante. La définition de la propriété sur false désactive la résolution de l'opération sortante. Si l'analyse est désactivée, l'action SOAP du message sortant est définie sur une opération anonyme dans les éditions précédentes. Si le client fournit une action SOAP via les propriétés JAX-WS javax.xml.ws.BindingProvider, SOAPACTION_USE_PROPERTY et SOAPACTION_URI_PROPERTY, l'action SOAP est utilisée. Par conséquent, l'analyse du message sortant n'a pas lieu quel que soit le paramétrage de la propriété. La définition d'une action SOAP de manière explicite par le client est considérée comme une meilleure pratique, particulièrement pour les performances sur le fournisseur du service. Cette pratique empêche l'analyse du message entrant, son transfert vers l'opération du noeud final correct.

Exemple

L'exemple suivant illustre la procédure permettant de créer un client Dispatch et d'appeler un noeud final de service EchoService.
String endpointUrl = ...;
		
QName serviceName = new QName("http://com/ibm/was/wssample/echo/",
 "EchoService");
QName portName = new QName("http://com/ibm/was/wssample/echo/",
 "EchoServicePort");
		
/** Create a service and add at least one port to it. **/ 
Service service = Service.create(serviceName);
service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, endpointUrl);
		
/** Create a Dispatch instance from a service.**/ 
Dispatch<SOAPMessage> dispatch = service.createDispatch(portName, 
SOAPMessage.class, Service.Mode.MESSAGE);
	
/** Create SOAPMessage request. **/
// compose a request message
MessageFactory mf = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);

// Create a message.  This example works with the SOAPPART.
SOAPMessage request = mf.createMessage();
SOAPPart part = request.getSOAPPart();

// Obtain the SOAPEnvelope and header and body elements.
SOAPEnvelope env = part.getEnvelope();
SOAPHeader header = env.getHeader();
SOAPBody body = env.getBody();

// Construct the message payload.
SOAPElement operation = body.addChildElement("invoke", "ns1",
 "http://com/ibm/was/wssample/echo/");
SOAPElement value = operation.addChildElement("arg0");
value.addTextNode("ping");
request.saveChanges();

/** Invoke the service endpoint. **/
SOAPMessage response = dispatch.invoke(request);

/** Process the response. **/

Icône indiquant le type de rubrique Rubrique de tâche



Icône d'horodatage Dernière mise à jour: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxwsdynclient
Nom du fichier : twbs_jaxwsdynclient.html