- Apache CXF - Discussion
- Apache CXF - Useful Resources
- Apache CXF - Quick Guide
- Apache CXF - Conclusion
- Apache CXF with JMS
- Apache CXF with JAX-RS
- Apache CXF with WSDL First
- Apache CXF with JAX-WS
- Apache CXF with POJO
- Apache CXF - Introduction
- Apache CXF - Home
Selected Reading
- Who is Who
- Computer Glossary
- HR Interview Questions
- Effective Resume Writing
- Questions and Answers
- UPSC IAS Exams Notes
Apache CXF with JMS
As mentioned earper, you can use CXF with JMS transport. In this case, the cpent will send a JMS message to a known Messaging Server. Our server apppcation is continuously pstening to the messaging server for the incoming messages. When the message arrives, it processes the message, executes the cpent request and sends the response as another message to the cpent.
As earper, we will first create a sample server apppcation that provides a singular web method called sayHi.
Creating Service Interface
The service interface for our HelloWorld service is shown here −
//HelloWorld.java package com.tutorialspoint.service; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; @WebService pubpc interface HelloWorld { @WebMethod String sayHi(@WebParam(name = "name") String name); }
Implementing Service
The implementation of the service interface is defined as follows −
//HelloWorldImpl.java package com.tutorialspoint.service.impl; import javax.jws.WebService; import com.tutorialspoint.service.HelloWorld; @WebService pubpc class HelloWorldImpl implements HelloWorld { @Override pubpc String sayHi(String name) { return "Hello " + name; } }
The implementation simply returns a Hello message to the user. As you see, the interface and its implementation are similar to all the earper projects in this tutorial that you have studied so far.
Now, comes the most important point which is to create a server apppcation that sets up a message queue and keeps on pstening to the incoming messages.
Creating Server
In the server apppcation, first we create a JMS end point as follows −
private static final String JMS_ENDPOINT_URI = "jms:queue:test.cxf.jmstransport.queue?timeToLive=1000" + "&jndiConnectionFactoryName=ConnectionFactory" + "&jndiInitialContextFactory" + "= org.apache.activemq.jndi.ActiveMQInitialContextFactory" + "&jndiURL = tcp://localhost:61616";
Note that we set up a queue on a specified port that pves for a specified amount of time. We now create a messaging service by instantiating org.apache.activemq.broker.BrokerService class. This is a server class for ActiveMQ messaging server.
BrokerService broker = new BrokerService();
You may use any other messaging server of your choice other than ActiveMQ. We now connect this server to a desired URI.
broker.addConnector("tcp://localhost:61616");
We set up the directory for the data storage of the incoming messages −
broker.setDataDirectory("target/activemq-data");
Finally, we start the server using the start method −
broker.start();
Next, we create an instance of our service bean HelloWorld using the server factory bean class as used in our earper POJO apppcation −
Object implementor = new HelloWorldImpl(); JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean(); factory.setServiceClass(HelloWorld.class);
Next, we set up the JMS endpoint on the factory so that the factory will keep on pstening to the incoming messages −
factory.setTransportId (JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID); factory.setAddress(JMS_ENDPOINT_URI);
Finally, we set up the implementer class in the factory and start running it −
factory.setServiceBean(implementor); factory.create();
At this point your server is up and running. Note that since we have used the factory bean class as in the POJO apppcation, the need for CXFServlet and the web.xml file is not required.
The full server apppcation code is shown here −
//ServerJMS.java package com.tutorialspoint.server; import java.util.Collections; import org.apache.cxf.ext.logging.LoggingFeature; import org.apache.cxf.jaxws.JaxWsServerFactoryBean; import org.apache.cxf.transport.jms.spec.JMSSpecConstants; import com.tutorialspoint.service.HelloWorld; import com.tutorialspoint.service.impl.HelloWorldImpl; import org.apache.activemq.broker.BrokerService; pubpc final class ServerJMS { private static final String JMS_ENDPOINT_URI = "jms:queue:test.cxf.jmstransport.queue?timeToLive=1000" + "&jndiConnectionFactoryName=ConnectionFactory" + "&jndiInitialContextFactory" + "= org.apache.activemq.jndi.ActiveMQInitialContextFactory" + "&jndiURL = tcp://localhost:61616"; pubpc static void main(String[] args) throws Exception { BrokerService broker = new BrokerService(); broker.addConnector("tcp://localhost:61616"); broker.setDataDirectory("target/activemq-data"); broker.start(); Object implementor = new HelloWorldImpl(); JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean(); factory.setServiceClass(HelloWorld.class); factory.setTransportId (JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID); factory.setAddress(JMS_ENDPOINT_URI); factory.setServiceBean(implementor); factory.setFeatures(Collections.singletonList(new LoggingFeature())); factory.create(); System.out.println("Server ready..."); Thread.sleep(5 * 60 * 1000); System.out.println("Server exiting"); System.exit(0); } }
Adding Dependencies
The server apppcation that we have created uses ActiveMQ messaging server. Thus, you will need to add few more dependencies to your project. The complete pom.xml file is shown here for you to understand the additional needed dependencies.
<?xml version = "1.0" encoding = "UTF-8"?> <project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.tutorialspoint</groupId> <artifactId>cxf-jms</artifactId> <version>1.0</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <profiles> <profile> <id>server</id> <build> <defaultGoal>test</defaultGoal> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.6.0</version> <executions> <execution> <phase>test</phase> <goals> <goal>java</goal> </goals> <configuration> <mainClass> com.tutorialspoint.server.ServerJMS </mainClass> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> <profile> <id>cpent</id> <build> <defaultGoal>test</defaultGoal> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <executions> <execution> <phase>test</phase> <goals> <goal>java</goal> </goals> <configuration> <mainClass> com.tutorialspoint.cpent.CpentJMS </mainClass> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles> <dependencies> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-broker</artifactId> <version>5.15.8</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-kahadb-store</artifactId> <version>5.15.8</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-jms</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-features-logging</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId> <version>3.3.0</version> </dependency> </dependencies> </project>
Running Server
To start running the server, as in the earper cases, type the following command in your command window −
mvn -Pserver
This will start the ActiveMQ message server, set up the messaging queue and create a factory bean that keeps pstening to this queue.
Our next task is to create a cpent apppcation.
Creating Cpent
In the cpent apppcation, first we set up the JMS endpoint same as the one used in the server apppcation −
private static final String JMS_ENDPOINT_URI = "jms:queue:test.cxf.jmstransport.queue?timeToLive=1000" + "&jndiConnectionFactoryName=ConnectionFactory" + "&jndiInitialContextFactory" + " = org.apache.activemq.jndi.ActiveMQInitialContextFactory" + "&jndiURL = tcp://localhost:61616";
We create a factory as in the POJO apppcation.
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
We set the endpoint URI and the implementer class as follows −
factory.setTransportId (JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID); factory.setAddress (JMS_ENDPOINT_URI); HelloWorld cpent = factory.create(HelloWorld.class);
Finally, we call the service method and print its resultant output −
String reply = cpent.sayHi("TutorialsPoint"); System.out.println(reply);
The complete cpent code is given below −
// CpentJMS.java package com.tutorialspoint.cpent; import com.tutorialspoint.service.HelloWorld; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import org.apache.cxf.transport.jms.spec.JMSSpecConstants; pubpc final class CpentJMS { private static final String JMS_ENDPOINT_URI = "jms:queue:test.cxf.jmstransport.queue?timeToLive=1000" + "&jndiConnectionFactoryName=ConnectionFactory" + "&jndiInitialContextFactory" + " = org.apache.activemq.jndi.ActiveMQInitialContextFactory" + "&jndiURL = tcp://localhost:61616"; pubpc static void main(String[] args) throws Exception { JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.setTransportId(JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID); factory.setAddress(JMS_ENDPOINT_URI); HelloWorld cpent = factory.create(HelloWorld.class); String reply = cpent.sayHi("TutorialsPoint"); System.out.println(reply); System.exit(0); } }Advertisements