Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Polished writing.

...

SOAP over JMS specification is aimed at a set of standards for the transport of SOAP messages over JMS. The main purpose is to ensure interoperability between the implementations of different Web services vendors. CXF supports SOAP over JMS specification, and is compliant with the this specification.

What's new

...

compared to the old CXF JMS Transport

SOAP over JMS transport supports the most configuration configurations of JMS Transport and does provides some extension extensions to support the SOAP over JMS specification. Such as jms:address, SOAP over JMS Transport uses the JMS URI (jms:address, for example) to describe the JMS address addressing information and use provides new WSDL extension extensions for the JMS configuration of JMS.

SOAP over JMS Namespace

WSDL Namespace

The WSDL extensions for defining a JMS endpoint are using this namespace http://www.w3.org/2008/07/soap/bindings/JMS/Image Removed. use a special namespace. In order to use this the JMS WSDL extensions you will need to add the namespace definition shown below to the definitions element of your contract.

...

JMS endpoints need to know the address information about how to establish a connection for establishing connections to the proper destination. SOAP over JMS implements the URI Scheme for Java Message Service 1.0.

...

Properties are as follows:

Property

DefaultVauleDefaultValue

Description

deliveryMode

PERSISTENT

NON_PERSISTENT messages will kept only be kept in memory
PERSISTENT messages will be persisted saved to disk

jndiConnectionFactoryName

 

Specifies the JNDI name bound to the JMS connection factory to use when connecting to the JMS destination.

jndiInitialContextFactory

 

Specifies the fully qualified Java class name of the "InitialContextFactory" implementation class to use.

jndiURL

 

Specifies the JNDI provider URL

replyToName

 

Specifies the JNDI name bound to the JMS destinations where replies are sent.

priority

4

Priority for the messages. See your JMS provider doc documentation for details

timeToLive

0

After this time Time (in ms) after which the message will be discarded by the jms provider

Additional JNDI Parameters

 

Additional parameters for a JNDI provider. A custom parameter name must start with the prefix "jndi-".

For more details about what information to use in these attributes, please check out the JMS URI specification.

...

Various JMS properties may be set in three places in the WSDL — the binding, the service, and the port. Values specified at the service will propagate to all ports. Values specified at the binding will propagate to all ports using that binding.
For example, if the jndiInitialContextFactory may be is indicated for a service, and it is then implied it will be used for all of the contained port elements it contains.

Field

DefaultVauleDefaultValue

Description

deliveryMode

PERSISTENT

NON_PERSISTENT messages will only be kept in memory
PERSISTENT messages will be persisted saved to disk

jndiConnectionFactoryName

 

Specifies the JNDI name bound to the JMS connection factory to use when connecting to the JMS destination.

jndiInitialContextFactory

 

Specifies the fully qualified Java class name of the "InitialContextFactory" implementation class to use.

jndiURL

 

Specifies the JNDI provider URL

replyToName

 

Specifies the JNDI name bound to the JMS destinations where replies are sent.

priority

4

Priority for the messages. See your JMS provider doc for details

timeToLive

0

After this time Time (in ms) after which the message will be discarded by the jms provider

jndiContextParameter

 

Additional parameters for a JNDI provider.

An example is as followsHere is an example:

Code Block
xml
xml
<wsdl11:binding name="exampleBinding">
  <soapjms:jndiContextParameter name="name" value="value" />
<soapjms:jndiConnectionFactoryName>ConnectionFactory
</soapjms:jndiConnectionFactoryName>
<soapjms:jndiInitialContextFactory>
org.apache.activemq.jndi.ActiveMQInitialContextFactory
</soapjms:jndiInitialContextFactory>
<soapjms:jndiURL>tcp://localhost:61616
</soapjms:jndiURL>
<soapjms:deliveryMode>PERSISTENT</soapjms:deliveryMode>
<soapjms:priority>5</soapjms:priority>
  <soapjms:timeToLive>200</soapjms:timeToLive>
</wsdl11:binding>

<wsdl11:service name="exampleService">
  <soapjms:jndiInitialContextFactory>
    com.example.jndi.InitialContextFactory
  </soapjms:jndiInitialContextFactory>
  <soapjms:timeTolive>100</soapjms:timeToLive>
  ...
  <wsdl11:port name="quickPort" binding="tns:exampleBinding">
    ...
    <soapjms:timeToLive>10</soapjms:timeToLive>
  </wsdl11:port>
  <wsdl11:port name="slowPort" binding="tns:exampleBinding">
    ...
  </wsdl11:port>
</wsdl11:service>

If a property is specified at multiple levels, the most specific setting setting at the most granular level takes precedence (port first, then service, then binding). In the above example, notice the timeToLive property — for the quickPort port, the value will be 10 10ms (specified at the port level). For the slowPort port, the value will be 100 100ms (specified at the service level). The In this example, the setting in the binding is, in this example, always will always be overridden.

WSDL Usage

The For this example is as follows:

Code Block
xml
xml
<wsdl:definitions name="JMSGreeterService"
	<wsdl:binding name="JMSGreeterPortBinding" type="tns:JMSGreeterPortType">
		<soap:binding style="document"
			transport="http://www.w3.org/2008/07/soap/bindings/JMS/" />
		<soapjms:jndiContextParameter name="name"
			value="value" />
		<soapjms:jndiConnectionFactoryName>ConnectionFactory
		</soapjms:jndiConnectionFactoryName>
		<soapjms:jndiInitialContextFactory>
			org.apache.activemq.jndi.ActiveMQInitialContextFactory
		</soapjms:jndiInitialContextFactory>
		<soapjms:jndiURL>tcp://localhost:61616
		</soapjms:jndiURL>
		<soapjms:deliveryMode>PERSISTENT</soapjms:deliveryMode>
		<soapjms:priority>5</soapjms:priority>
		<soapjms:timeToLive>1000</soapjms:timeToLive>
		<wsdl:operation name="greetMe">
			<soap:operation soapAction="test" style="document" />
			<wsdl:input name="greetMeRequest">
				<soap:body use="literal" />
			</wsdl:input>
			<wsdl:output name="greetMeResponse">
				<soap:body use="literal" />
			</wsdl:output>
		</wsdl:operation>
	</wsdl:binding>
	<wsdl:service name="JMSGreeterService">
		<wsdl:port binding="tns:JMSGreeterPortBinding" name="GreeterPort">
			<soap:address		 location="jms:jndi:dynamicQueues/test.cxf.jmstransport.queue" />
		</wsdl:port>
	</wsdl:service>
</wsdl:definitions>

Publishing an service with the JAVA API

Some user Developers who doesndon't want to get touch with any WSDL stuff could wish to modify the WSDL file can also publish the endpoint with CXF information using Java code. For CXF's SOAP over JMS . First implementation you could write as follows.can write the following:

Code Block
java
java
        // You just need to set the address with JMS URI
        String address = "jms:jndi:dynamicQueues/test.cxf.jmstransport.queue3"
            + "?jndiInitialContextFactory"
            + "=org.apache.activemq.jndi.ActiveMQInitialContextFactory"
            + "&jndiConnectionFactoryName=ConnectionFactory&jndiURL=tcp://localhost:61500";
        Hello implementor = new HelloImpl();
        JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean();
        svrFactory.setServiceClass(Hello.class);
        svrFactory.setAddress(address);
        // And specify the transport ID with SOAP over JMS specification
        svrFactory.setTransportId(JMSSpecConstants.SOAP_JMS_SPECIFICIATION_TRANSPORTID);
        svrFactory.setServiceBean(implementor);
        svrFactory.create();

Consume the service with the API

The Sample code how to consumer the service with the SOAP over JMS transport to consume a SOAP-over-JMS service is as follows:

Code Block
java
java
      public void invoke() throws Exception {
        // You just need to set the address with JMS URI
        String address = "jms:jndi:dynamicQueues/test.cxf.jmstransport.queue3"
            + "?jndiInitialContextFactory"
            + "=org.apache.activemq.jndi.ActiveMQInitialContextFactory"
            + "&jndiConnectionFactoryName=ConnectionFactory&jndiURL=tcp://localhost:61500";
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        // And specify the transport ID with SOAP over JMS specification
        factory.setTransportId(JMSSpecConstants.SOAP_JMS_SPECIFICIATION_TRANSPORTID);
        factory.setServiceClass(Hello.class);
        factory.setAddress(address);
        Hello client = (Hello)factory.create();
        String reply = client.sayHi(" HI");
        System.out.println(reply);
    }

...

Differences between the SOAP over JMS and the CXF old JMS transport implementation

There are some differences between the SOAP over JMS and the previous CXF old over JMS transport implementation.

  1. The JMS Messages sent by SOAP over JMS transport implementation are in accord accordance with the SOAP over JMS specification. Then , allowing CXF can to interoperate with other SOAP over JMS implementationimplementations.You can use new method for configuration about SOAP over JMS
  2. , and it is accord with the Additional techniques are provided for configuring SOAP over JMS specification.
  3. SOAP over JMS The new implementation provides more sophisticated error - handling for the message of SOAP /over JMS messages.