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