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.
- 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.
Procédure
Résultats
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
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. **/