Apache CXF พร้อม JMS

ดังที่ได้กล่าวไว้ก่อนหน้านี้คุณสามารถใช้ CXF กับการขนส่ง JMS ในกรณีนี้ไคลเอนต์จะส่งข้อความ JMS ไปยัง Messaging Server ที่รู้จัก แอปพลิเคชันเซิร์ฟเวอร์ของเรากำลังรับฟังเซิร์ฟเวอร์การส่งข้อความอย่างต่อเนื่องสำหรับข้อความขาเข้า เมื่อข้อความมาถึงระบบจะประมวลผลข้อความดำเนินการตามคำขอของไคลเอ็นต์และส่งการตอบกลับเป็นข้อความอื่นไปยังไคลเอ็นต์

ก่อนหน้านี้เราจะสร้างแอปพลิเคชันเซิร์ฟเวอร์ตัวอย่างก่อนซึ่งมีวิธีการเว็บเอกพจน์ที่เรียกว่า sayHi.

การสร้างอินเทอร์เฟซบริการ

อินเทอร์เฟซบริการสำหรับ HelloWorld แสดงบริการที่นี่ -

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

การใช้บริการ

การใช้งานอินเทอร์เฟซบริการกำหนดไว้ดังนี้ -

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

การนำไปใช้เพียงส่งคืนข้อความสวัสดีให้กับผู้ใช้ อย่างที่คุณเห็นอินเทอร์เฟซและการใช้งานนั้นคล้ายกับโครงการก่อนหน้านี้ทั้งหมดในบทช่วยสอนนี้ที่คุณได้ศึกษาจนถึงตอนนี้

ตอนนี้ประเด็นสำคัญที่สุดคือการสร้างแอปพลิเคชันเซิร์ฟเวอร์ที่ตั้งค่าคิวข้อความและรับฟังข้อความขาเข้าต่อไป

การสร้างเซิร์ฟเวอร์

ในแอปพลิเคชันเซิร์ฟเวอร์ก่อนอื่นเราสร้างไฟล์ JMS จุดสิ้นสุดดังนี้ -

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

โปรดทราบว่าเราตั้งค่าคิวบนพอร์ตที่ระบุซึ่งมีอายุการใช้งานตามระยะเวลาที่กำหนด ตอนนี้เราสร้างบริการส่งข้อความโดยการสร้างอินสแตนซ์org.apache.activemq.broker.BrokerServiceชั้นเรียน นี่คือคลาสเซิร์ฟเวอร์สำหรับActiveMQ เซิร์ฟเวอร์การส่งข้อความ

BrokerService broker = new BrokerService();

คุณสามารถใช้เซิร์ฟเวอร์การส่งข้อความอื่น ๆ ที่คุณเลือกนอกเหนือจาก ActiveMQ. ตอนนี้เราเชื่อมต่อเซิร์ฟเวอร์นี้กับ URI ที่ต้องการ

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

เราตั้งค่าไดเร็กทอรีสำหรับจัดเก็บข้อมูลของข้อความขาเข้า -

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

ในที่สุดเราเริ่มเซิร์ฟเวอร์โดยใช้วิธีเริ่มต้น -

broker.start();

ต่อไปเราจะสร้างอินสแตนซ์ของถั่วบริการของเรา HelloWorld โดยใช้คลาส bean โรงงานเซิร์ฟเวอร์ตามที่ใช้ในแอปพลิเคชัน POJO ก่อนหน้านี้ของเรา -

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

ต่อไปเราจะตั้งค่าจุดสิ้นสุด JMS ในโรงงานเพื่อให้โรงงานรับฟังข้อความขาเข้าต่อไป -

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

ในที่สุดเราก็ตั้งค่าคลาสผู้ใช้งานในโรงงานและเริ่มเรียกใช้งาน -

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

ณ จุดนี้เซิร์ฟเวอร์ของคุณเริ่มทำงานแล้ว โปรดทราบว่าเนื่องจากเราใช้คลาส bean จากโรงงานในแอปพลิเคชัน POJO จึงไม่จำเป็นต้องใช้ CXFServlet และไฟล์ web.xml

รหัสแอปพลิเคชันเซิร์ฟเวอร์แบบเต็มแสดงที่นี่ -

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

การเพิ่มการอ้างอิง

แอ็พพลิเคชันเซิร์ฟเวอร์ที่เราสร้างขึ้นใช้เซิร์ฟเวอร์การส่งข้อความ ActiveMQ ดังนั้นคุณจะต้องเพิ่มการอ้างอิงเพิ่มเติมในโครงการของคุณ ไฟล์ pom.xml ที่สมบูรณ์จะแสดงที่นี่เพื่อให้คุณเข้าใจการอ้างอิงที่จำเป็นเพิ่มเติม

<?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>

กำลังรันเซิร์ฟเวอร์

ในการเริ่มรันเซิร์ฟเวอร์ดังเช่นในกรณีก่อนหน้านี้ให้พิมพ์คำสั่งต่อไปนี้ในหน้าต่างคำสั่งของคุณ -

mvn -Pserver

สิ่งนี้จะเริ่มเซิร์ฟเวอร์ข้อความ ActiveMQ ตั้งค่าคิวการส่งข้อความและสร้างบีนโรงงานที่คอยฟังคิวนี้

งานต่อไปของเราคือการสร้างแอปพลิเคชันไคลเอนต์

การสร้างลูกค้า

ในแอปพลิเคชันไคลเอนต์อันดับแรกเราตั้งค่าจุดสิ้นสุด JMS เหมือนกับที่ใช้ในแอปพลิเคชันเซิร์ฟเวอร์ -

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

เราสร้างโรงงานเหมือนในแอปพลิเคชัน POJO

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();

เราตั้งค่า URI ปลายทางและคลาส Implementer ดังนี้ -

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

รหัสลูกค้าที่สมบูรณ์จะได้รับด้านล่าง -

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