Как упоминалось ранее, вы можете использовать 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");
Наконец, мы запускаем сервер, используя метод запуска —
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 конечной точки и класс реализатора следующим образом:
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);
Полный код клиента приведен ниже —