Apache CXF с JMS
Как упоминалось ранее, вы можете использовать CXF с транспортом JMS. В этом случае клиент отправит сообщение JMS на известный сервер обмена сообщениями. Наше серверное приложение постоянно прослушивает сервер обмена сообщениями в поисках входящих сообщений. Когда сообщение приходит, он обрабатывает его, выполняет запрос клиента и отправляет ответ клиенту в виде другого сообщения.
Как и раньше, мы сначала создадим пример серверного приложения, которое предоставляет единственный веб-метод, называемый 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");
Наконец, мы запускаем сервер, используя метод start -
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();
На данный момент ваш сервер запущен и работает. Обратите внимание: поскольку мы использовали класс фабричного компонента, как в приложении 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 конечной точки и класс средства реализации следующим образом:
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);
}
}