Apache CXF com JMS
Conforme mencionado anteriormente, você pode usar CXF com transporte JMS. Nesse caso, o cliente enviará uma mensagem JMS a um Servidor de Mensagens conhecido. Nosso aplicativo de servidor está continuamente ouvindo o servidor de mensagens para as mensagens recebidas. Quando a mensagem chega, ele a processa, executa a solicitação do cliente e envia a resposta como outra mensagem ao cliente.
Como anteriormente, primeiro criaremos um aplicativo de servidor de amostra que fornece um método da web único chamado sayHi.
Criando Interface de Serviço
A interface de serviço para nosso HelloWorld serviço é mostrado aqui -
//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);
}
Serviço de Implementação
A implementação da interface de serviço é definida da seguinte forma -
//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;
}
}
A implementação simplesmente retorna uma mensagem Hello para o usuário. Como você pode ver, a interface e sua implementação são semelhantes a todos os projetos anteriores neste tutorial que você estudou até agora.
Agora, vem o ponto mais importante que é criar um aplicativo de servidor que configure uma fila de mensagens e continue ouvindo as mensagens recebidas.
Criando Servidor
No aplicativo de servidor, primeiro criamos um JMS ponto final da seguinte forma -
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";
Observe que configuramos uma fila em uma porta especificada que vive por um determinado período de tempo. Agora criamos um serviço de mensagens instanciandoorg.apache.activemq.broker.BrokerServiceclasse. Esta é uma classe de servidor paraActiveMQ servidor de mensagens.
BrokerService broker = new BrokerService();
Você pode usar qualquer outro servidor de mensagens de sua escolha, exceto ActiveMQ. Agora, conectamos este servidor a um URI desejado.
broker.addConnector("tcp://localhost:61616");
Configuramos o diretório para o armazenamento de dados das mensagens recebidas -
broker.setDataDirectory("target/activemq-data");
Finalmente, iniciamos o servidor usando o método start -
broker.start();
Em seguida, criamos uma instância de nosso bean de serviço HelloWorld usando a classe de bean de fábrica do servidor, conforme usado em nosso aplicativo POJO anterior -
Object implementor = new HelloWorldImpl();
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
factory.setServiceClass(HelloWorld.class);
Em seguida, configuramos o endpoint JMS na fábrica para que a fábrica continue ouvindo as mensagens recebidas -
factory.setTransportId
(JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID);
factory.setAddress(JMS_ENDPOINT_URI);
Por fim, configuramos a classe implementador na fábrica e começamos a executá-la -
factory.setServiceBean(implementor);
factory.create();
Neste ponto, seu servidor está instalado e funcionando. Observe que, como usamos a classe do bean de fábrica como no aplicativo POJO, a necessidade do CXFServlet e do arquivo web.xml não é necessária.
O código completo do aplicativo do servidor é mostrado aqui -
//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);
}
}
Adicionando Dependências
O aplicativo de servidor que criamos usa o servidor de mensagens ActiveMQ. Portanto, você precisará adicionar mais algumas dependências ao seu projeto. O arquivo pom.xml completo é mostrado aqui para que você entenda as dependências adicionais necessárias.
<?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>
Servidor em execução
Para iniciar a execução do servidor, como nos casos anteriores, digite o seguinte comando na janela de comando -
mvn -Pserver
Isso iniciará o servidor de mensagens ActiveMQ, configurará a fila de mensagens e criará um bean de fábrica que continua escutando esta fila.
Nossa próxima tarefa é criar um aplicativo cliente.
Criando Cliente
No aplicativo cliente, primeiro configuramos o ponto de extremidade JMS igual ao usado no aplicativo servidor -
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";
Criamos uma fábrica como no aplicativo POJO.
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
Definimos o URI do endpoint e a classe do implementador da seguinte forma -
factory.setTransportId (JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID);
factory.setAddress (JMS_ENDPOINT_URI);
HelloWorld client = factory.create(HelloWorld.class);
Finalmente, chamamos o método de serviço e imprimimos sua saída resultante -
String reply = client.sayHi("TutorialsPoint");
System.out.println(reply);
O código completo do cliente é fornecido abaixo -
// 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);
}
}