JMS ile Apache CXF
Daha önce de belirtildiği gibi, CXF'yi JMS aktarımıyla kullanabilirsiniz. Bu durumda, istemci bilinen bir Mesajlaşma Sunucusuna bir JMS mesajı gönderecektir. Sunucu uygulamamız gelen mesajlar için sürekli olarak mesajlaşma sunucusunu dinlemektedir. Mesaj geldiğinde, mesajı işler, müşteri talebini yürütür ve yanıtı müşteriye başka bir mesaj olarak gönderir.
Daha önce olduğu gibi, ilk önce tekil bir web yöntemi sağlayan örnek bir sunucu uygulaması oluşturacağız. sayHi.
Servis Arayüzü Oluşturma
Bizim için servis arayüzü HelloWorld hizmet burada gösterilmektedir -
//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);
}
Uygulama Hizmeti
Servis arayüzünün uygulanması şu şekilde tanımlanır -
//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;
}
}
Uygulama basitçe kullanıcıya bir Merhaba mesajı döndürür. Gördüğünüz gibi, arayüz ve uygulaması, bu eğitimde şimdiye kadar çalışmış olduğunuz tüm önceki projelere benzer.
Şimdi en önemli nokta, bir mesaj kuyruğu kuran ve gelen mesajları dinlemeye devam eden bir sunucu uygulaması oluşturmaktır.
Sunucu Oluşturma
Sunucu uygulamasında önce bir JMS bitiş noktası aşağıdaki gibidir -
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";
Belirli bir süre boyunca yaşayan belirli bir bağlantı noktasında bir kuyruk oluşturduğumuzu unutmayın. Şimdi örnekleyerek bir mesajlaşma hizmeti oluşturuyoruzorg.apache.activemq.broker.BrokerServicesınıf. Bu bir sunucu sınıfıdırActiveMQ mesajlaşma sunucusu.
BrokerService broker = new BrokerService();
Dışında seçtiğiniz başka herhangi bir mesajlaşma sunucusunu kullanabilirsiniz. ActiveMQ. Şimdi bu sunucuyu istenen bir URI'ye bağlıyoruz.
broker.addConnector("tcp://localhost:61616");
Gelen mesajların veri depolaması için dizini kuruyoruz -
broker.setDataDirectory("target/activemq-data");
Son olarak, başlangıç yöntemini kullanarak sunucuyu başlatıyoruz -
broker.start();
Ardından, servis bean'ımızın bir örneğini oluşturuyoruz HelloWorld önceki POJO uygulamamızda kullanılan sunucu fabrikası fasulye sınıfını kullanarak -
Object implementor = new HelloWorldImpl();
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
factory.setServiceClass(HelloWorld.class);
Daha sonra, fabrikanın gelen mesajları dinlemeye devam etmesi için fabrikada JMS uç noktasını kurduk -
factory.setTransportId
(JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID);
factory.setAddress(JMS_ENDPOINT_URI);
Son olarak, fabrikada uygulayıcı sınıfını kurar ve çalıştırmaya başlarız -
factory.setServiceBean(implementor);
factory.create();
Bu noktada sunucunuz hazır ve çalışıyor. POJO uygulamasında olduğu gibi fabrika fasulyesi sınıfını kullandığımız için, CXFServlet ve web.xml dosyasına ihtiyaç duyulmadığına dikkat edin.
Tam sunucu uygulama kodu burada gösterilmektedir -
//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);
}
}
Bağımlılıklar Ekleme
Oluşturduğumuz sunucu uygulaması ActiveMQ mesajlaşma sunucusunu kullanmaktadır. Bu nedenle, projenize birkaç tane daha bağımlılık eklemeniz gerekecektir. Ek ihtiyaç duyulan bağımlılıkları anlamanız için eksiksiz pom.xml dosyası burada gösterilmektedir.
<?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>
Çalışan Sunucu
Sunucuyu daha önceki durumlarda olduğu gibi çalıştırmaya başlamak için, komut pencerenize aşağıdaki komutu yazın -
mvn -Pserver
Bu, ActiveMQ mesaj sunucusunu başlatacak, mesajlaşma kuyruğunu ayarlayacak ve bu kuyruğu dinlemeye devam eden bir fabrika fasulyesi oluşturacaktır.
Bir sonraki görevimiz bir istemci uygulaması oluşturmaktır.
İstemci Oluşturma
İstemci uygulamasında, önce JMS uç noktasını sunucu uygulamasında kullanılanla aynı şekilde kurarız -
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 uygulamasında olduğu gibi fabrika oluşturuyoruz.
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
Uç nokta URI'sini ve uygulayıcı sınıfını aşağıdaki gibi ayarladık -
factory.setTransportId (JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID);
factory.setAddress (JMS_ENDPOINT_URI);
HelloWorld client = factory.create(HelloWorld.class);
Son olarak, servis yöntemini çağırıyoruz ve sonuç çıktısını yazdırıyoruz -
String reply = client.sayHi("TutorialsPoint");
System.out.println(reply);
Tam müşteri kodu aşağıda verilmiştir -
// 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);
}
}