Puede escribir una extensión WSDL (Web Services Description Language) que permite que el servicio
Web Services Invocation Framework (WSIF) acceda a un servicio SOAP que utiliza
Java™ Message Service (JMS) como su mecanismo de transporte.
Antes de empezar
En este tema se presupone que ha elegido y configurado un proveedor JMS al instalar
WebSphere Application Server
(ya sea el proveedor de mensajería predeterminado u otro proveedor como el proveedor de mensajería de WebSphere MQ). Si no es así, hágalo como se describe en
Elección de un proveedor de mensajería.
Acerca de esta tarea
Si un mensaje SOAP contiene sólo XML, puede utilizar el mecanismo de transporte JMS (Java Message Service) con el tipo de cuerpo de mensaje JMS TextMessage.
El mensaje SOAP, junto con el sobre de SOAP, se incluye en el mensaje
JMS y se coloca en la cola adecuada. El contenedor recibe el mensaje de JMS y
elimina el mensaje SOAP destinado al cliente.
Utilice el procedimiento siguiente y los fragmentos de código asociados que le ayudarán a escribir la extensión WSDL (Web Services Description Language) que permite al servicio WSIF acceder a un servicio SOAP a través de JMS.
Nota: También puede utilizar este procedimiento como guía para escribir la extensión de enlace WSDL para SOAP a través de HTTP, porque el enlace SOAP a través de JMS es casi idéntico al enlace SOAP a través de HTTP.
Procedimiento
- Seleccione el enlace SOAP a través de JMS
Debe establecer el atributo transport
del distintivo <soap:binding> para indicar que se utiliza JMS. Si también desea establecer el atributo style en
rpc (llamada a procedimiento remoto), WSIF (Web Services
Invocation Framework) supone que se invoca una operación en el punto final de servicio web:
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/jms"/>
- Establezca la dirección JMS.
Nota: Consulte
también el método alternativo de especificar la dirección JMS que se
proporciona en el paso siguiente.
Para SOAP a través de JMS, el distintivo <wsdl:port>
debe contener un elemento <jms:address>. Este elemento proporciona la información necesaria para que un cliente pueda conectarse correctamente al servicio web mediante el modelo de programación JMS. Generalmente, son los archivos de apéndice generados para dar soporte al
enlace SOAP a través de JMS los que actúan como cliente de JMS. Como
alternativa, el cliente de servicio web puede utilizar el modelo de
programación JMS directamente.
El elemento
<jms:address>
adopta este formato:
<jms:address
destinationStyle= "queue"
jmsVendorURI = "http://ibm.com/ns/mqseries"?
initialContextFactory= "com.ibm.NamingFactory"?
jndiProviderURL= "iiop://something:900/wherever"?
jndiConnectionFactoryName= "orange"
jndiDestinationName="fred">
<jms:propertyValue name="targetService" type="xsd:string"
value="StockQuoteServicePort"/>
</jms:address>
donde los atributos marcados con el signo de interrogación
(
?)
son opcionales.
El atributo jmsVendorURI
opcional es una serie que identifica de forma exclusiva la implementación
de JMS. WSIF no tiene en cuenta este URI, que utiliza el desarrollador de
clientes, y quizás la implementación de cliente, para determinar si tiene
acceso al proveedor de JMS correcto en el entorno de tiempo de ejecución del
cliente.
Los atributos opcionales initialContextFactory y
jndiProviderURL sólo se pueden omitir, si el entorno de tiempo
de ejecución tiene un proveedor JNDI
(Java
Naming and Directory Interface) por omisión configurado.
El atributo jndiConnectionFactoryName proporciona el nombre de un objeto
ConnectionFactory de JMS, que se puede buscar en el contexto JNDI proporcionado por el atributo
jndiContext.
Este objeto ConnectionFactory se utiliza para crear una conexión de JMS con la instancia de proveedor de JMS que es propietaria de la cola. En una configuración simple, la escucha de mensajes del servidor y los clientes
utilizan el mismo objeto ConnectionFactory. Sin embargo, tanto el servidor como los clientes pueden utilizar objetos
ConnectionFactory distintos, siempre y cuando todos ellos
creen conexiones con la misma instancia de proveedor de JMS.
El atributo value
del elemento targetService <jms:propertyValue> es el nombre
del componente de puerto del servicio de destino tal como se ha definido en el elemento <port-component-name>
del archivo webservices.xml para el servicio de destino.
- Establezca la dirección JMS (método alternativo).
En cambio, para el proveedor
de SOAP a través de JMS puede especificar la dirección JMS utilizando el distintivo <soap:address>
con el formato siguiente:
jms:/[cola|tema]?<propiedad>=<valor>&<property>=<value>&...
donde la especificación de
cola o
tema corresponde al atributo
destinationStyle de la dirección JMS.
Tabla 1. Propiedades que son válidas para utilizarlas con el código <soap:address>. La columna 1 especifica el nombre de propiedad, la columna 2 describe la propiedad y la columna 3 especifica el valor de dirección JMS correspondiente. Nombre de propiedad |
Descripción de la propiedad |
Valor de dirección JMS correspondiente |
destination |
Nombre JNDI del tema o la cola de destino |
jndiDestinationName |
connectionFactory |
Nombre JNDI de la fábrica de conexiones. |
jndiConnectionFactory |
targetService |
Nombre del componente de puerto del servicio de destino |
targetService jms:propertyValue dentro de jms:address |
Propiedades relacionadas con JNDI
(opcional): |
initialContextFactory |
Nombre de la fábrica de contexto inicial. |
initialContextFactory |
jndiProviderURL |
URL del proveedor de JNDI |
jndiProviderURL |
Propiedades relacionadas con JMS (opcional): |
deliveryMode |
Indica si el mensaje de solicitud debe ser persistente o
no. Los valores válidos son DeliveryMode.NON_PERSISTENT (valor predeterminado) y DeliveryMode.PERSISTENT |
JMSDeliveryMode |
password |
Contraseña que se debe utilizar para obtener acceso a la
fábrica de conexiones. |
JMSPassword |
priority |
La prioridad JMS asociada con el mensaje de
solicitud. Los valores válidos son entre 0 y 9. El valor predeterminado es 4. |
JMSDeliveryMode |
replyTo |
La cola de destino JNDI a la que deben enviarse los mensajes de respuesta. |
JMSReplyTo |
timeToLive |
La duración (en milisegundos) del mensaje de solicitud. Un valor 0 indica una duración infinita. |
JMSTimeToLive |
userid |
ID de usuario que se debe utilizar para obtener acceso a
la fábrica de conexiones. |
JMSUserid |
Éste es un ejemplo de este formato:
<jms:address> format:
<wsdl:port name="StockQuoteServicePort"
binding="sqi:StockQuoteSoapJMSBinding">
<jms:address destinationStyle="queue"
jndiConnectionFactoryName="myQCF"
jndiDestinationName="myQ"
initialContextFactory= "com.ibm.NamingFactory"
jndiProviderURL="iiop://something:900/">
<jms:propertyValue name="targetService"
type="xsd:string"
value="StockQuoteServicePort"/>
</jms:address>
</wsdl:port>
<soap:address> format:
<wsdl:port name="StockQuoteServicePort"
binding="sqi:StockQuoteSoapJMSBinding">
<soap:address location="jms:/queue?connectionFactory=myQCF&destination
=myQ&initialContextFactory=com.ibm.NamingFactory&jndiProviderURL
=iiop://something:900/&targetService=StockQuoteServicePort" />
</wsdl:port>
- Establezca las cabeceras y propiedades JMS.
Debe utilizar el distintivo <jms:property>
para establecer las cabeceras y propiedades JMS. Este distintivo correlaciona una parte
del mensaje o valor literal con una propiedad de JMS:
<jms:property name="Priority" {part="requestPriority" | value="fixedValue"}/>
Si <jms:property> tiene un valor
literal, también se puede anidar en el distintivo <jms:address>:
<jms:property name="Priority" value="fixedValue" />
Este formato del distintivo <jms:property> se utiliza en el enlace JMS nativo.
Ejemplo de WSDL que define un enlace SOAP a través de JMS
<!-- Ejemplo: Mensaje de texto de SOAP a través de JMS -->
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
name="StockQuoteInterfaceDefinitions"
targetNamespace="urn:StockQuoteInterface"
xmlns:tns="urn:StockQuoteInterface"
xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:jms="http://schemas.xmlsoap.org/wsdl/jms/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:message name="GetQuoteInput">
<part name="symbol" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="GetQuoteOutput">
<part name="value" type="xsd:float"/>
</wsdl:message>
<wsdl:portType name="StockQuoteInterface">
<wsdl:operation name="GetQuote">
<wsdl:input message="tns:GetQuoteInput"/>
<wsdl:output message="tns:GetQuoteOutput"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="StockQuoteSoapJMSBinding" type="tns:StockQuoteInterface">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/jms"/>
<wsdl:operation name="GetQuote">
<soap:operation soapAction="urn:StockQuoteInterface#GetQuote"/>
<wsdl:input>
<soap:body use="encoded" namespace="urn:StockQuoteService"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:input>
<wsdl:output>
<soap:body use="encoded" namespace="urn:StockQuoteService"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="StockQuoteService">
<wsdl:port name="StockQuoteServicePort"
binding="sqi:StockQuoteSoapJMSBinding">
<jms:address destinationStyle="queue"
jndiConnectionFactoryName="myQCF"
jndiDestinationName="myQ"
initialContextFactory= "com.ibm.NamingFactory"
jndiProviderURL="iiop://something:900/">
<jms:propertyValue name="targetService"
type="xsd:string"
value="StockQuoteServicePort"/>
</jms:address>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>