Apache CXF với JMS
Như đã đề cập trước đó, bạn có thể sử dụng CXF với JMS transport. Trong trường hợp này, máy khách sẽ gửi một tin nhắn JMS đến một Máy chủ Nhắn tin đã biết. Ứng dụng máy chủ của chúng tôi liên tục lắng nghe máy chủ nhắn tin cho các tin nhắn đến. Khi tin nhắn đến, nó sẽ xử lý thông báo, thực hiện yêu cầu của khách hàng và gửi phản hồi dưới dạng một thông điệp khác đến máy khách.
Như trước đó, trước tiên chúng ta sẽ tạo một ứng dụng máy chủ mẫu cung cấp một phương thức web đơn lẻ được gọi là sayHi.
Tạo giao diện dịch vụ
Giao diện dịch vụ cho HelloWorld dịch vụ được hiển thị ở đây -
//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);
}
Dịch vụ triển khai
Việc triển khai giao diện dịch vụ được định nghĩa như sau:
//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;
}
}
Việc triển khai chỉ đơn giản là trả về một thông báo Xin chào cho người dùng. Như bạn thấy, giao diện và cách triển khai của nó tương tự như tất cả các dự án trước đó trong hướng dẫn này mà bạn đã nghiên cứu cho đến nay.
Bây giờ, đến điểm quan trọng nhất là tạo một ứng dụng máy chủ để thiết lập hàng đợi tin nhắn và tiếp tục lắng nghe các tin nhắn đến.
Tạo máy chủ
Trong ứng dụng máy chủ, trước tiên, chúng tôi tạo JMS điểm cuối như sau -
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";
Lưu ý rằng chúng tôi thiết lập một hàng đợi trên một cổng cụ thể tồn tại trong một khoảng thời gian nhất định. Bây giờ chúng tôi tạo ra một dịch vụ nhắn tin bằng cách khởi tạoorg.apache.activemq.broker.BrokerServicelớp học. Đây là một lớp máy chủ choActiveMQ máy chủ nhắn tin.
BrokerService broker = new BrokerService();
Bạn có thể sử dụng bất kỳ máy chủ nhắn tin nào khác mà bạn chọn ngoài ActiveMQ. Bây giờ chúng tôi kết nối máy chủ này với một URI mong muốn.
broker.addConnector("tcp://localhost:61616");
Chúng tôi thiết lập thư mục để lưu trữ dữ liệu của các tin nhắn đến -
broker.setDataDirectory("target/activemq-data");
Cuối cùng, chúng tôi khởi động máy chủ bằng phương pháp bắt đầu -
broker.start();
Tiếp theo, chúng tôi tạo một phiên bản của dịch vụ bean HelloWorld bằng cách sử dụng lớp bean của nhà máy máy chủ như được sử dụng trong ứng dụng POJO trước đó của chúng tôi -
Object implementor = new HelloWorldImpl();
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
factory.setServiceClass(HelloWorld.class);
Tiếp theo, chúng tôi thiết lập điểm cuối JMS trên nhà máy để nhà máy tiếp tục lắng nghe các tin nhắn đến -
factory.setTransportId
(JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID);
factory.setAddress(JMS_ENDPOINT_URI);
Cuối cùng, chúng tôi thiết lập lớp triển khai trong nhà máy và bắt đầu chạy nó -
factory.setServiceBean(implementor);
factory.create();
Tại thời điểm này, máy chủ của bạn đã hoạt động. Lưu ý rằng vì chúng tôi đã sử dụng lớp đậu gốc như trong ứng dụng POJO, nên không cần CXFServlet và tệp web.xml.
Mã ứng dụng máy chủ đầy đủ được hiển thị ở đây -
//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);
}
}
Thêm phụ thuộc
Ứng dụng máy chủ mà chúng tôi đã tạo sử dụng máy chủ nhắn tin ActiveMQ. Do đó, bạn sẽ cần thêm một vài phụ thuộc vào dự án của mình. Tệp pom.xml hoàn chỉnh được hiển thị ở đây để bạn hiểu các phụ thuộc cần thiết bổ sung.
<?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>
Máy chủ đang chạy
Để bắt đầu chạy máy chủ, như trong các trường hợp trước, hãy nhập lệnh sau vào cửa sổ lệnh của bạn:
mvn -Pserver
Thao tác này sẽ khởi động máy chủ tin nhắn ActiveMQ, thiết lập hàng đợi nhắn tin và tạo một factory bean tiếp tục lắng nghe hàng đợi này.
Nhiệm vụ tiếp theo của chúng ta là tạo một ứng dụng khách.
Tạo khách hàng
Trong ứng dụng khách, trước tiên, chúng tôi thiết lập điểm cuối JMS giống như điểm cuối được sử dụng trong ứng dụng máy chủ -
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";
Chúng tôi tạo một nhà máy như trong ứng dụng POJO.
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
Chúng tôi đặt URI điểm cuối và lớp trình triển khai như sau:
factory.setTransportId (JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID);
factory.setAddress (JMS_ENDPOINT_URI);
HelloWorld client = factory.create(HelloWorld.class);
Cuối cùng, chúng tôi gọi phương thức dịch vụ và in đầu ra kết quả của nó -
String reply = client.sayHi("TutorialsPoint");
System.out.println(reply);
Mã khách hàng hoàn chỉnh được cung cấp bên dưới:
// 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);
}
}