Apache CXF with JMS Example
Apache CXF is a popular Java web services framework that supports a variety of protocols, including Java Message Service (JMS). Here's an example of how to use Apache CXF with JMS:
First, you need to set up a JMS broker. Apache ActiveMQ is a popular open-source JMS broker that you can use for testing purposes. You can download it from the Apache ActiveMQ website.
Create a new Maven project and add the following dependencies to your project's pom.xml file:
<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-jms</artifactId> <version>${cxf.version}</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>${activemq.version}</version> </dependency>
Replace ${cxf.version}
and ${activemq.version}
with the latest versions of CXF and ActiveMQ, respectively.
- Create a new interface for your JMS service, for example:
@WebService @SOAPBinding(style = Style.RPC) public interface MyService { @WebMethod void sendMessage(String message); }
- Create a new implementation class for your JMS service, for example:
@WebService(endpointInterface = "com.example.MyService") public class MyServiceImpl implements MyService { @Override public void sendMessage(String message) { // TODO: Send JMS message } }
- Configure CXF to use JMS by adding the following to your application context file (e.g. applicationContext.xml):
<jaxws:endpoint id="myService" implementor="com.example.MyServiceImpl" address="/myService"> <jaxws:properties> <entry key="org.apache.cxf.transport.jms.JMSConfigFeature.enabled" value="true"/> <entry key="org.apache.cxf.transport.jms.JMSConfigFeature.connectionFactory" value="ConnectionFactory"/> <entry key="org.apache.cxf.transport.jms.JMSConfigFeature.targetDestination" value="queue:myQueue"/> </jaxws:properties> </jaxws:endpoint>
This configuration enables CXF's JMSConfigFeature, which allows you to specify the JMS connection factory and destination for your service. In this example, we're using a JMS queue named "myQueue".
- In your implementation class, you can use CXF's JMS Transport API to send JMS messages:
import org.apache.cxf.transport.jms.JMSMessageHeadersType; import org.apache.cxf.transport.jms.JMSConstants; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.Session; import javax.xml.ws.WebServiceContext; import javax.xml.ws.handler.MessageContext; @WebService(endpointInterface = "com.example.MyService") public class MyServiceImpl implements MyService { @Resource private WebServiceContext context; @Override public void sendMessage(String message) { MessageContext messageContext = context.getMessageContext(); JMSMessageHeadersType headers = new JMSMessageHeadersType(); headers.setJMSCorrelationID("correlationId"); headers.setJMSDeliveryMode(2); headers.setJMSPriority(5); headers.setTimeToLive(10000); headers.setProperty("MyCustomProperty", "MyCustomValue"); messageContext.put(JMSConstants.JMS_CLIENT_REQUEST_HEADERS, headers); ConnectionFactory cf = (ConnectionFactory) messageContext.get(JMSConstants.JMS_CONNECTION