Apache CXF mit JMS

Wie bereits erwähnt, können Sie CXF mit JMS-Transport verwenden. In diesem Fall sendet der Client eine JMS-Nachricht an einen bekannten Messaging-Server. Unsere Serveranwendung überwacht kontinuierlich den Nachrichtenserver auf eingehende Nachrichten. Wenn die Nachricht eintrifft, verarbeitet sie die Nachricht, führt die Clientanforderung aus und sendet die Antwort als weitere Nachricht an den Client.

Wie bereits zuvor werden wir zunächst eine Beispielserveranwendung erstellen, die eine einzelne Webmethode namens bereitstellt sayHi.

Serviceschnittstelle erstellen

Die Service-Schnittstelle für unsere HelloWorld Service wird hier gezeigt -

//HelloWorld.java
package com.tutorialspoint.service;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

@WebService
public interface HelloWorld {
   @WebMethod
   String sayHi(@WebParam(name = "name") String name);
}

Service implementieren

Die Implementierung der Serviceschnittstelle ist wie folgt definiert:

//HelloWorldImpl.java
package com.tutorialspoint.service.impl;

import javax.jws.WebService;
import com.tutorialspoint.service.HelloWorld;

@WebService
public class HelloWorldImpl implements HelloWorld {
   @Override
   public String sayHi(String name) {
      return "Hello " + name;
   }
}

Die Implementierung gibt einfach eine Hello-Nachricht an den Benutzer zurück. Wie Sie sehen, ähneln die Benutzeroberfläche und ihre Implementierung allen früheren Projekten in diesem Lernprogramm, die Sie bisher studiert haben.

Jetzt kommt der wichtigste Punkt, nämlich das Erstellen einer Serveranwendung, die eine Nachrichtenwarteschlange einrichtet und die eingehenden Nachrichten weiter abhört.

Server erstellen

In der Serveranwendung erstellen wir zunächst eine JMS Endpunkt wie folgt -

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";

Beachten Sie, dass wir eine Warteschlange an einem bestimmten Port einrichten, die für eine bestimmte Zeitdauer gültig ist. Wir erstellen jetzt einen Nachrichtendienst durch Instanziierenorg.apache.activemq.broker.BrokerServiceKlasse. Dies ist eine Serverklasse fürActiveMQ Messaging-Server.

BrokerService broker = new BrokerService();

Sie können einen anderen Messaging-Server Ihrer Wahl als verwenden ActiveMQ. Wir verbinden diesen Server nun mit einem gewünschten URI.

broker.addConnector("tcp://localhost:61616");

Wir richten das Verzeichnis für die Datenspeicherung der eingehenden Nachrichten ein -

broker.setDataDirectory("target/activemq-data");

Schließlich starten wir den Server mit der Startmethode -

broker.start();

Als Nächstes erstellen wir eine Instanz unserer Service Bean HelloWorld Verwenden der Server Factory Bean-Klasse, wie sie in unserer früheren POJO-Anwendung verwendet wurde -

Object implementor = new HelloWorldImpl();
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
factory.setServiceClass(HelloWorld.class);

Als Nächstes richten wir den JMS-Endpunkt werkseitig ein, damit die Fabrik die eingehenden Nachrichten weiter abhört.

factory.setTransportId
(JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID);
factory.setAddress(JMS_ENDPOINT_URI);

Schließlich richten wir die Implementierungsklasse in der Factory ein und starten sie -

factory.setServiceBean(implementor);
factory.create();

Zu diesem Zeitpunkt ist Ihr Server betriebsbereit. Da wir die Factory-Bean-Klasse wie in der POJO-Anwendung verwendet haben, sind CXFServlet und die Datei web.xml nicht erforderlich.

Der vollständige Anwendungscode der Server wird hier angezeigt -

//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;

public 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";

   public 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);
   }
}

Abhängigkeiten hinzufügen

Die von uns erstellte Serveranwendung verwendet den ActiveMQ-Messaging-Server. Daher müssen Sie Ihrem Projekt einige weitere Abhängigkeiten hinzufügen. Die vollständige Datei pom.xml wird hier angezeigt, damit Sie die zusätzlich erforderlichen Abhängigkeiten verstehen.

<?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>client</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.client.ClientJMS
                           </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>

Server ausführen

Geben Sie den folgenden Befehl in Ihr Befehlsfenster ein, um den Server wie in den früheren Fällen auszuführen:

mvn -Pserver

Dadurch wird der ActiveMQ-Nachrichtenserver gestartet, die Messaging-Warteschlange eingerichtet und eine Factory-Bean erstellt, die diese Warteschlange weiter überwacht.

Unsere nächste Aufgabe ist es, eine Client-Anwendung zu erstellen.

Client erstellen

In der Clientanwendung richten wir zuerst den JMS-Endpunkt so ein, wie er in der Serveranwendung verwendet wird.

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";

Wir erstellen eine Fabrik wie in der POJO-Anwendung.

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();

Wir setzen den Endpunkt-URI und die Implementierungsklasse wie folgt:

factory.setTransportId (JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID);
factory.setAddress (JMS_ENDPOINT_URI);
HelloWorld client = factory.create(HelloWorld.class);

Schließlich rufen wir die Servicemethode auf und drucken die resultierende Ausgabe -

String reply = client.sayHi("TutorialsPoint");
System.out.println(reply);

Der vollständige Client-Code ist unten angegeben -

// ClientJMS.java
package com.tutorialspoint.client;

import com.tutorialspoint.service.HelloWorld;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.transport.jms.spec.JMSSpecConstants;

public final class ClientJMS {
   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";

   public static void main(String[] args) throws Exception {
      JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
      factory.setTransportId(JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID);
      factory.setAddress(JMS_ENDPOINT_URI);
      HelloWorld client = factory.create(HelloWorld.class);
      String reply = client.sayHi("TutorialsPoint");
      System.out.println(reply);
      System.exit(0);
   }
}