Apache CXF - Hızlı Kılavuz

Günümüz ortamında, birkaç seçeneği kullanarak bir web servis uygulaması oluşturabilirsiniz. İletişim için birçok standart ve yaygın olarak kabul edilen protokollerden birini veya daha fazlasını kullanabilirsiniz. Örneğin SOAP , XML / HTTP, RESTful HTTP ve CORBA (Eski günlerde çok popüler olan ancak şimdi çok sık kullanılmayan Common Object Request Broker Architecture).

Ayrıca HTTP, JMS , JBI gibi farklı aktarım seçenekleri ve JAX-RS ve JAX-WS gibi ön uç API seçeneklerine sahipsiniz . Web hizmeti geliştirme için pek çok seçeneğe sahip olan, yukarıda belirtilen tüm seçenekleri birbirine yapıştırmak için bir açık kaynak hizmetleri çerçevesine ihtiyaç vardır ve Apache CXF bunu yapar.

Bu eğitimde, yukarıda listelediğimiz seçeneklerden birini veya birkaçını kullanarak hem bir web hizmeti hem de hizmeti kullanan bir istemci oluşturmak için CXF'yi nasıl kullanacağınızı öğreneceksiniz. Bu eğitim, hem sunucu hem de istemci için tüm kod geliştirme boyunca size yol gösterecektir. Her uygulama, her kategorideki seçeneklerden yalnızca birini, yani ön uç, taşıma ve protokolü kullanabildiğinden, bu üçünün tüm permütasyonları ve kombinasyonları dikkate alındığında, uygulama sayısı son derece yüksek olacaktır.

Bu eğitim, aşağıdaki projelerin gelişimini ayrıntılı olarak tartışır -

  • Düz Eski Apache CXF Nesneleri (POJO) ile CXF

  • JAX-WS ile CXF

  • WSDL ile CXF

  • JAX-RS ile CXF

  • JMS ile CXF

Basitleştirmek için komut satırı arayüzüyle maven kullandık. Bir maven projesi oluşturmak için tercih ettiğiniz IDE'yi kullanabilirsiniz.

Bir sonraki bölümde ilkiyle başlayalım.

Bu bölümde, kullanıcıya selamlama mesajı gönderen basit bir web uygulamasının nasıl geliştirileceğini öğreneceksiniz. Bir web hizmeti projesi WSDL modelini kullanır . CXF, Apache CXF API'lerini temeldeki WSDL ile eşlemek için basit bir ön uç sağlayarak bu WSDL modelini gizlemenize olanak tanır.

Bu en basit projede, web hizmetinin arayüzü doğrudan istemciye gösterilecek ve müşteri web hizmetini çağırmak için yerel Apache CXF API'lerini kullanacaktır.

Öncelikle bir web servisi oluşturacağız. Her hizmetin istemciye açık bir arabirimi vardır. Bu arayüzü basit bir Apache CXF arayüzü veya WSDL belgesi olarak yazabiliriz. Bu Apache CXF-First yaklaşımında, hizmetimizi bir Apache CXF arayüzü aracılığıyla ortaya koyacağız.

Web Hizmeti Geliştirme

Web üzerinde oluşturacağımız hizmetin adı verilen tek bir web yöntemi olacaktır. greetings. Yöntem birstringkullanıcının adını göndereceğimiz bağımsız değişken yazın. Servis, arayan kişiye mesajda bulunan alınan kullanıcı adı ile bir selam mesajı gönderir.

Web Servis Arayüzü

Web hizmetimizin arayüzünü ortaya çıkarmak için aşağıdaki gibi bir Apache CXF arayüzü oluşturacağız -

//HelloWorld.java
package com.tutorialspoint.cxf.pojo;
public interface HelloWorld {
   String greetings(String text);
}

Arayüzün adı verilen tek bir yöntem vardır greetings. Sunucu bu arayüzü uygulayacaktır. Önemsiz uygulamamızda, bu arayüz doğrudan müşteriye sunulur. Genellikle, bir web hizmeti uygulamasında, web hizmeti arabirimini açıklamak için WSDL kullanırsınız. Bu basit uygulamada, bu doğrudan arayüzü müşteri geliştiricisine sağlayacağız. Müşteri daha sonra arayacaktırgreetingssunucu nesnesinde mesaj. Öyleyse önce web servisini oluşturalım.

Web Servis Uygulaması

HelloWorld arayüz, HelloWorldImpl Apache CXF sınıfı aşağıda gösterildiği gibi -

//HelloWorldImpl.java
package com.tutorialspoint.cxf.pojo;
public class HelloWorldImpl implements HelloWorld {
   @Override
   public String greetings(String text) {
      return "Hi " + text;
   }
}

greetings yöntem bir parametre alır string yazın, bir karşılama mesajına ekler ve ortaya çıkan dizeyi arayana geri döndürür.

Ardından, sunucu uygulamasını barındırmak için yazıyoruz. HelloWorld hizmet.

Sunucu Oluşturma

Sunucu uygulaması iki bölümden oluşur -

  • İlk bölüm, web servisimiz için bir fabrika oluşturur ve

  • İkinci bölüm bir yazıyor main örnekleme yöntemi.

Sunucu kullanır ServerFactoryBean CXF kitaplıkları tarafından sağlanan sınıf, HelloWorlduzak istemcilere arayüz. Böylece, ilk önceServerFactoryBean sınıfını seçin ve ardından çeşitli özelliklerini ayarlayın -

ServerFactoryBean factory = new ServerFactoryBean();

Çağrılacak hizmet sınıfını setServiceClass yöntemi factory nesne -

factory.setServiceClass(HelloWorld.class);

Fabrikamızı arayarak servisimizi aramak için URL belirledik. setAddressyöntem. Hizmetin bu URL'de yayınlanacağını unutmayın.

factory.setAddress("http://localhost:5000/Hello");

Bu durumda, hizmet katıştırılmış sunucuya dağıtılır ve 5000 numaralı bağlantı noktasını dinleyecektir. İstediğiniz herhangi bir bağlantı noktası numarasını seçebilirsiniz.

Fabrikayı oluşturmadan önce fabrikaya servis uygulama sınıfımızı anlatmanız gerekmektedir. Bu, arayarak yapılırsetServiceBean yöntemi factory burada gösterildiği gibi nesne -

factory.setServiceBean(new HelloWorldImpl());

Hizmet çekirdeği, hizmet uygulama sınıfımızın örneğine ayarlanır. Son olarak fabrikayı kendi adını vererek oluşturuyoruz.create yöntem -

factory.create();

Şimdi, fabrikayı web hizmetimizi çalıştırmak için geliştirdiğimiz için, bundan sonra bir main onu somutlaştırmak ve bir süre çalışmasını sağlamak için yöntem.

Şimdi bir yaz main örnekleme yöntemi HelloServer aşağıdaki gibi sınıf -

public static void main(String[] args) throws Exception {
   new HelloServer();
   System.out.println("Listening on port 5000 ...");
}

Bir kez somutlaştırıldığında, HelloServersınıf süresiz olarak çalışmaya devam edecek. Üretim dağıtımları için, sunucunuzu kesinlikle sonsuza kadar çalışır durumda tutacaksınız. Mevcut durumda, önceden belirlenmiş bir süre sonra aşağıdaki gibi sunucuyu sonlandırırız -

Thread.sleep(5 * 60 * 1000);
System.out.println("Server exiting ...");
System.exit(0);

İçin kodun tamamı HelloServer sınıf aşağıda verilmiştir -

//HelloServer.java
//HelloServer.java
package com.tutorialspoint.cxf.pojo;
import org.apache.cxf.frontend.ServerFactoryBean;
public class HelloServer {
   protected HelloServer() throws Exception {
      ServerFactoryBean factory = new ServerFactoryBean();
      factory.setServiceClass(HelloWorld.class);
      factory.setAddress("http://localhost:5000/Hello");
      factory.setServiceBean(new HelloWorldImpl());
      factory.create();
   }
   public static void main(String[] args) throws Exception {
      new HelloServer();
      System.out.println("Listening on port 5000 ...");
      Thread.sleep(5 * 60 * 1000);
      System.out.println("Server exiting ...");
      System.exit(0);
   }
}

Oluşturduğumuz sunucu uygulaması, ServerFactoryBeanCXF kitaplıklarından sınıf. Şimdi bu kitaplıkları başarıyla derlemek için projemize dahil etmeliyizHelloServersınıf. KullanacağızMaven proje bağımlılıklarını kurmak için.

Maven Projesini Kurmak

Bir Maven projesi oluşturmak için, komut satırı pencerenize aşağıdaki komutu yazın. Bunu bir Mac makinede test ettiğimizi unutmayın. Windows ve Linux kurulumları için talimatlar birkaç yerde farklılık gösterebilir.

mvn archetype:generate

Özellikler sorulduğunda, aşağıdaki değerleri girin -

Define value for property 'groupId': : com.tutorialspoint
Define value for property 'artifactId': : cxf-pojo
Define value for property 'version': 1.0-SNAPSHOT: : 1.0
Define value for property 'package': com.tutorialspoint: : com.tutorialspoint.cxf.pojo

Maven komutunun tamamlanmasının ardından, pom.xml dosyası ile birlikte mevcut klasörünüzde oluşturulan uygun klasör yapısını bulacaksınız.

Oluşturulan dizin yapısı burada gösterilmektedir -

CXF bağımlılıklarını pom.xmlve ayrıca yukarıda oluşturulan Apache CXF dosyalarını maven tarafından oluşturulan yapının uygun klasörüne kopyalayın. Hazır referansınız için makinemizde oluşturduğumuz projeye ait pom.xml dosyasını aşağıda verdik.

<?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-pojo</artifactId>
   <version>1.0</version>
   <packaging>jar</packaging>
   
   <profiles>
      <profile>
         <id>server</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.cxf.pojo.HelloServer
                           </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.cxf.pojo.HelloClient
                           </mainClass>
                        </configuration>
                     </execution>
                  </executions>
               </plugin>
            </plugins>
         </build>
      </profile>
   </profiles>

   <dependencies>
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-features-logging</artifactId>
         <version>3.3.0</version>
         <type>jar</type>
      </dependency>
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-frontend-simple</artifactId>
         <version>3.3.0</version>
         <type>jar</type>
      </dependency>
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-transports-http</artifactId>
         <version>3.3.0</version>
      </dependency>
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-frontend-jaxws</artifactId>
         <version>3.3.0</version>
      </dependency>
      <!-- Jetty is needed if you're using the CXFServlet -->
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-transports-http-jetty</artifactId>
         <version>3.3.0</version>
      </dependency>
   </dependencies>
   <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>
</project>

Yukarıdaki pom.xml, bu projeyle ilgisi olmayan, ancak bu eğitimdeki bir sonraki projemiz için gerekli olan ek bağımlılıklar içerebilir. Her neyse, ek bağımlılıkların dahil edilmesinin hiçbir zararı yoktur.

Proje Klasör Yapısı

Sunucu ve istemci Apache CXF dosyalarını yerleştirdikten sonra makinemdeki proje klasörü yapısı, hızlı başvuru için aşağıda gösterilmiştir -

Çalışan Sunucu

Projeyi oluşturmak için komut satırı pencerenizde aşağıdaki komutu kullanın -

mvn clean install

Sunucuyu aşağıdaki komutu kullanarak başlatabilirsiniz -

mvn -Pserver

Bu, sunucuyu başlatacak ve konsolda aşağıdaki istemi göreceksiniz -

INFO: Creating Service {http://pojo.cxf.tutorialspoint.com/}HelloWorld from class com.tutorialspoint.cxf.pojo.HelloWorld
INFO: Setting the server's publish address to be http://localhost:5000/Hello
Listening on port 5000 ...

Şimdi, tarayıcı pencerenizde yayınlanan hizmetimizin URL'sini belirtin. Aşağıdaki çıktıyı göreceksiniz -

Bu, hizmetimizin bir localhost üzerinde belirtilen bağlantı noktasında çalıştığını doğrular. Belirtmediğimiz içingreetings Çağrımızda mesaj, tarayıcıya bir SOAP hata mesajı geri dönüyor.

Web hizmetinizi, seçtiğiniz bir SOAP istemcisini kullanarak daha fazla test edebilirsiniz. Burada sunucumuzu test etmek için Postman kullandık .

Çıktı burada gösterildiği gibidir -

Bunu gözlemleyin SOAP Requestelle kodlandı. İsteği gönderdikten sonra, sunucu birSOAP Response Ekran görüntüsünün alt kısmında görülen mesaj.

Buradan, CXF'in günümüz dünyasında var olan çeşitli web teknolojilerine birleşik bir görünüm sağlarken hem istek hem de yanıt için SOAP protokollerinin kullanımını sürdürdüğünü anlayabilirsiniz. Bu, web uygulaması geliştirmeyi büyük ölçüde basitleştirir.

Bir sonraki görevimiz, oluşturduğunuz web hizmetini kullanacak bir istemci oluşturmaktır.

İstemci Oluşturma

Sunucu uygulamasında HelloWorldweb servisimizi ortaya çıkaran arayüzdür. Web hizmetinin kendisi sadece müşteriye basit bir karşılama mesajı sağlar. Genellikle, web hizmeti arabirimi WSDL (Web Hizmetleri Açıklama Dili) kullanılarak dış dünyaya sunulur. Bu önemsiz uygulamada, web hizmetimizi doğrudan hizmet arayüzünü göstererek müşteriye sunacağız ve bu,HelloWorld.class.

Bu amaçla, CXF adı verilen bir fabrika sınıfı sağlar ClientProxyFactoryBean bu, yaratılan fabrika örneğine istenen arayüze bağlanmamızı sağlar.

İlk olarak, aşağıdaki gibi bir fabrika fasulyesi örneği oluşturuyoruz -

ClientProxyFactoryBean factory = new ClientProxyFactoryBean();

Biz arıyoruz setAddressweb hizmetimizin çağrılabileceği URL'yi ayarlamak için fabrika fasulye örneğinde yöntem. Bizim durumumuzda, önceki adımımızda sunucuyu oluştururken kullanılan URL'yi kullanacağız -

factory.setAddress("http://localhost:5000/Hello");

Sonra biz diyoruz create yöntemi factory hizmet arayüzümüzü eklemek için örnek HelloWorld.class ona.

HelloWorld helloServer = factory.create(HelloWorld.class);

Son olarak diyoruz greetings uzak web hizmetini çağırma yöntemi.

System.out.println(helloServer.greetings(System.getProperty("user.name")));

Bu, konsolunuza bir selam mesajı yazdırır.

İstemci uygulamasının tüm kaynağı aşağıda gösterilmektedir -

//HelloClient.java
package com.tutorialspoint.cxf.pojo;
import org.apache.cxf.frontend.ClientProxyFactoryBean;
public class HelloClient {
   public static void main(String[] args) throws Exception {
      ClientProxyFactoryBean factory = new ClientProxyFactoryBean();
      factory.setAddress("http://localhost:5000/Hello");
      HelloWorld helloServer = factory.create(HelloWorld.class);
      System.out.println(helloServer.greetings(System.getProperty("user.name")));
   }
}

Çalışan İstemci

Makinenizde sunucunun hala çalıştığından emin olun. Zaman aşımına uğramışsa, aşağıdaki komutla sunucuyu yeniden başlatın -

mvn -Pserver

Konsolda aşağıdaki mesajı göreceksiniz -

Listening on port 5000 ...

Şimdi, 5 dakikaya ayarladığımız sunucu zaman aşımına uğramadan önce, başka bir komut satırı penceresi açın ve istemciyi aşağıdaki komutla başlatın -

mvn -Pclient

Komut satırında aşağıdakine benzer bir mesaj göreceksiniz -

Hi tutorialspoint

Bunu not et tutorialspointbizim kullanıcı adımızdır. Kendi adınızla bir selamlama alacaksınız.

Sonraki bölümde, CXF'yi bir JAX-WS (XML Web Hizmetleri için Apache CXF API) projesinde nasıl kullanacağımızı öğreneceğiz.

Bu JAX-WS uygulamasında, önceki POJO uygulaması gibi Apache CXF-ilk yaklaşımını kullanacağız. Bu yüzden önce web servisimiz için bir arayüz oluşturacağız.

Servis Arayüzünü Bildirme

Daha önceki durumda olduğu gibi, selamlar adı verilen tek bir arayüz yöntemine sahip önemsiz bir hizmet oluşturacağız. Servis arayüzü kodu aşağıda gösterilmiştir -

//HelloWorld.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.jws.WebService;

@WebService
public interface HelloWorld {
   String greetings(String text);
}

Arayüzü bir @WebServiceetiket. Daha sonra bu arayüzü uygulayacağız.

Web Arayüzünün Uygulanması

Web arayüzünün uygulaması burada gösterilmektedir -

//HelloWorldImpl.java
package com.tutorialspoint.cxf.jaxws.helloworld;
public class HelloWorldImpl implements HelloWorld {
   @Override
   public String greetings(String name) {
      return ("hi " + name);
   }
}

Selamlama yöntemi ile açıklanmıştır @Overrideetiket. Yöntem, arayan kişiye bir "merhaba" mesajı verir.

Ardından, sunucuyu geliştirmek için kod yazacağız.

Geliştirme Sunucusu

POJO uygulamasından farklı olarak, hizmetimizi yayınlamak için CXF tarafından sağlanan Endpoint sınıfını kullanarak arayüzü ayrıştıracağız. Bu, aşağıdaki iki kod satırında yapılır -

HelloWorld implementor = new HelloWorldImpl();
Endpoint.publish(
   "http://localhost:9090/HelloServerPort",
   implementor,
   new LoggingFeature()
);

Yayınlama yönteminin ilk parametresi, hizmetimizin istemcilere sunulacağı URL'yi belirtir. İkinci parametre, hizmetimiz için uygulama sınıfını belirtir. Sunucunun kodunun tamamı aşağıda gösterilmiştir -

//Server.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.xml.ws.Endpoint;
import org.apache.cxf.ext.logging.LoggingFeature;
public class Server {
   public static void main(String[] args) throws Exception {
      HelloWorld implementor = new HelloWorldImpl();
      Endpoint.publish("http://localhost:9090/HelloServerPort",
      implementor,
      new LoggingFeature());
      System.out.println("Server ready...");
      Thread.sleep(5 * 60 * 1000);
      System.out.println("Server exiting ...");
      System.exit(0);
   }
}

Sunucumuzu dağıtmak için, aşağıda listelendiği gibi projenizde birkaç değişiklik yapmanız gerekecektir.

Sunucuyu Dağıtma

Son olarak, sunucu uygulamasını dağıtmak için, uygulamanızı bir web uygulaması olarak kurmak için pom.xml'de bir değişiklik daha yapmanız gerekecektir. Eklemeniz gereken kodpom.xml aşağıda verilmiştir -

<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.cxf.jaxws.helloworld.Server
                        </mainClass>
                     </configuration>
                  </execution>
               </executions>
            </plugin>
         </plugins>
      </build>
   </profile>
</profiles>

Uygulamayı dağıtmadan önce, projenize iki dosya daha eklemeniz gerekir. Bunlar aşağıdaki ekran görüntüsünde gösterilmektedir -

Bu dosyalar, eşlemeyi tanımlayan CXF standart dosyalarıdır. CXFServlet. İçindeki kodweb.xml dosya burada hızlı başvuru için gösterilmektedir -

//Web.xml
<?xml version = "1.0" encoding = "UTF-8"??>
<web-app xmlns = "http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
   <display-name>cxf</display-name>
   <servlet>
      <description>Apache CXF Endpoint</description>
      <display-name>cxf</display-name>
      <servlet-name>cxf</servlet-name>
      <servlet-class>
         org.apache.cxf.transport.servlet.CXFServlet
      </servlet-class>
      <load-on-startup>
         1
      </load-on-startup>
   </servlet>
   <servlet-mapping>
      <servlet-name>
         cxf
      </servlet-name>
      <url-pattern>
         /services/*
      </url-pattern>
   </servlet-mapping>
   <session-config>
      <session-timeout>60</session-timeout>
   </session-config>
</web-app>

İçinde cxf-servlet.xml,hizmetinizin uç noktası için özellikleri bildirirsiniz. Bu, aşağıdaki kod pasajında ​​gösterilmektedir -

<beans ...>
   <jaxws:endpoint xmlns:helloworld = "http://tutorialspoint.com/"
      id = "helloHTTP"
      address = "http://localhost:9090/HelloServerPort"
      serviceName = "helloworld:HelloServiceService"
      endpointName = "helloworld:HelloServicePort">
   </jaxws:endpoint>
</beans>

Burada hizmet uç noktamızın kimliğini, hizmetin kullanılabileceği adresi, hizmet adını ve uç nokta adını tanımlarız. Şimdi, hizmetinizin bir CXF sunucu uygulaması tarafından nasıl yönlendirildiğini ve işlendiğini öğrendiniz.

Son pom.xml

pom.xmlbirkaç tane daha bağımlılık içerir. Tüm bağımlılıkları açıklamak yerine, aşağıya pom.xml'nin son sürümünü ekledik -

<?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-jaxws</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.cxf.jaxws.helloworld.Server
                           </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.cxf.jaxws.helloworld.Client
                           </mainClass>
                        </configuration>
                     </execution>
                  </executions>
               </plugin>
            </plugins>
         </build>
      </profile>
   </profiles>
   <dependencies>
      <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-http</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>

Ayrıca, bu öğreticinin sonraki bölümlerinde öğreneceğimiz müşteri oluşturmak için bir profil içerdiğini unutmayın.

HelloWorld Hizmetini Çalıştırmak

Artık web uygulamasını çalıştırmaya hazırsınız. Komut penceresinde, aşağıdaki komutu kullanarak derleme komut dosyasını çalıştırın.

mvn clean install
mvn -Pserver

Konsolda aşağıdaki mesajı göreceksiniz -

INFO: Setting the server's publish address to be http://localhost:9090/HelloServerPort
Server ready…

Daha önce olduğu gibi, tarayıcınızda sunucu URL'sini açarak sunucuyu test edebilirsiniz.

Herhangi bir işlem belirtmediğimiz için, uygulamamız tarafından tarayıcıya sadece bir hata mesajı dönmektedir.

Şimdi eklemeyi deneyin ?wsdl URL'nize ve aşağıdaki çıktıyı göreceksiniz -

Yani sunucu uygulamamız beklendiği gibi çalışıyor. SOAP İstemcisini aşağıdaki gibi kullanabilirsiniz:Postman hizmetinizi daha ayrıntılı test etmek için daha önce açıklanmıştır.

Bir sonraki bölümde, hizmetimizi kullanan bir müşteriyi nasıl yazacağımızı öğreneceğiz.

Müşteri Geliştirme

İstemciyi bir CXF uygulamasında yazmak, bir sunucu yazmak kadar önemsizdir. İşte müşteri için tam kod -

//Client.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.soap.SOAPBinding;
public final class Client {
   private static final QName SERVICE_NAME
   = new QName("http://helloworld.jaxws.cxf.tutorialspoint.com/",
   "HelloWorld");
   private static final QName PORT_NAME
   = new QName("http://helloworld.jaxws.cxf.tutorialspoint.com/",
   "HelloWorldPort");
   private Client() {
   }
   public static void main(String[] args) throws Exception {
      Service service = Service.create(SERVICE_NAME);
      System.out.println("service created");
      String endpointAddress = "http://localhost:9090/HelloServerPort";
      service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING,
      endpointAddress);
      HelloWorld hw = service.getPort(HelloWorld.class);
      System.out.println(hw.greetings("World"));
   }
}

Burada, sağlanan CXF'yi kullanıyoruz Servicebilinen hizmete bağlanacak sınıf. Biz arıyoruzcreate yöntemi Servicesınıf hizmetin bir örneğini almak için. Bilinen bağlantı noktasını arayarakaddPort yöntemi service örnek.

İlk olarak servis arayüzünü arayarak yaptığımız servisi artık tüketmeye hazırız. getPort yöntemi serviceörnek. Sonunda arıyoruzgreetings selam mesajını konsolda yazdırma yöntemi.

Şimdi, Apache CXF-First yaklaşımını kullanarak CXF'nin temellerini öğrendikçe, şimdi bir sonraki bölümde WSDL-First yaklaşımıyla CXF'yi nasıl kullanacağınızı öğreneceksiniz.

Geliştirdiğiniz CXF-POJO uygulaması, istemci ve sunucu arasında çok sıkı bir bağlantıya neden olur. Hizmet arayüzüne doğrudan erişim sağlamak, ciddi güvenlik tehditleri de oluşturabilir. Bu nedenle, WSDL (Web Servisleri Tanımlama Dili) kullanılarak gerçekleştirilen istemci ve sunucu arasındaki ayrıştırma genellikle istenir.

Web servis arayüzünü XML tabanlı bir WSDL belgesine yazıyoruz. Bu WSDL'yi daha sonra istemci ve sunucu uygulamalarımız tarafından uygulanan ve kullanılan Apache CXF arayüzlerine eşlemek için bir araç kullanacağız. Ayrıştırmayı sağlamak için WSDL ile başlamak tercih edilen bir yoldur. Bunun için önce yeni bir dil öğrenmelisiniz - WSDL. WSDL yazmak dikkatli bir yaklaşıma ihtiyaç duyar ve üzerinde çalışmaya başlamadan önce bu konuda biraz anlayış kazanmanız daha iyi olur.

Bu derste, bir WSDL belgesinde bir web hizmeti arayüzü tanımlayarak başlayacağız. WSDL ile başlayarak hem sunucu hem de istemci uygulamaları oluşturmak için CXF'yi nasıl kullanacağımızı öğreneceğiz. Uygulamayı CXF kullanımına odaklanmak için basit tutacağız. Sunucu uygulaması oluşturulduktan sonra, yerleşik bir CXF sınıfı kullanarak onu istenen bir URL'de yayınlayacağız.

Öncelikle kullanacağımız WSDL'yi tanımlayalım.

HelloWorld için WSDL

Uygulayacağımız web hizmetinin adında tek bir web yöntemi olacak greetings kabul eden stringparametre kullanıcı adını tutan ve kullanıcı adına bir selamlama mesajı ekledikten sonra arayana bir dize mesajı döndürür. Tam wsdl aşağıda gösterilmiştir -

//Hello.wsdl
<?xml version = "1.0" encoding = "UTF-8"?>
<wsdl:definitions xmlns:soap = "http://schemas.xmlsoap.org/wsdl/soap/"
   xmlns:tns = "http://helloworld.tutorialspoint.com/"
   xmlns:wsdl = "http://schemas.xmlsoap.org/wsdl/"
   xmlns:xsd = "http://www.w3.org/2001/XMLSchema"
   name = "HelloWorld"
   targetNamespace = "http://helloworld.tutorialspoint.com/">
   <wsdl:types>
      <xsd:schema attributeFormDefault = "unqualified"
         elementFormDefault = "qualified"
         targetNamespace = "http://helloworld.tutorialspoint.com/">
         <xsd:element name = "greetings" type = "tns:greetings"/>
         <xsd:complexType name = "greetings">
            <xsd:sequence>
               <xsd:element minOccurs = "0" name = "arg0" type = "xsd:string"/>
            </xsd:sequence>
         </xsd:complexType>
         <xsd:element name = "greetingsResponse"
         type = "tns:greetingsResponse"/>
         <xsd:complexType name = "greetingsResponse">
            <xsd:sequence>
               <xsd:element minOccurs = "0" name = "return" type = "xsd:string"/>
            </xsd:sequence>
         </xsd:complexType>
      </xsd:schema>
   </wsdl:types>
   <wsdl:message name = "greetings">
      <wsdl:part element = "tns:greetings" name = "parameters"> </wsdl:part>
   </wsdl:message>
   <wsdl:message name = "greetingsResponse">
      <wsdl:part element = "tns:greetingsResponse" name = "parameters"> </wsdl:part>
   </wsdl:message>
   <wsdl:portType name = "HelloWorldPortType">
      <wsdl:operation name = "greetings">
         <wsdl:input message = "tns:greetings" name = "greetings">  </wsdl:input>
         <wsdl:output message = "tns:greetingsResponse" name = "greetingsResponse">
         </wsdl:output>
      </wsdl:operation>
   </wsdl:portType>
   <wsdl:binding name = "HelloWorldSoapBinding" type = "tns:HelloWorldPortType">
      <soap:binding style = "document"
      transport = "http://schemas.xmlsoap.org/soap/http"/>
      <wsdl:operation name = "greetings">
         <soap:operation soapAction = "" style = "document"/>
         <wsdl:input name = "greetings"></wsdl:input>
         <wsdl:output name = "greetingsResponse">
            <soap:body use = "literal"/>
         </wsdl:output>
         </wsdl:operation>
   </wsdl:binding>
   <wsdl:service name = "HelloWorldService">
      <wsdl:port binding = "tns:HelloWorldSoapBinding" name = "HelloWorldPort">
         <soap:address location = "http://localhost:9090/HelloServerPort"/>
      </wsdl:port>
   </wsdl:service>
</wsdl:definitions>

Sözdizimsel olarak doğru bir wsdl yazmak, geliştiriciler için her zaman bir zorluk olmuştur; wsdl oluşturmak için birçok araç ve çevrimiçi düzenleyici mevcuttur. Bu düzenleyiciler, bir mesajda iletmek istediğiniz parametrelerle birlikte uygulamak istediğiniz mesajların adlarını ve istemci uygulamanızın almasını istediğiniz geri dönüş mesajı türünü sorarlar. Wsdl sözdizimini biliyorsanız, tüm belgeyi elinize alabilir veya kendinizinkini oluşturmak için düzenleyicilerden birini kullanabilirsiniz.

Yukarıdaki wsdl'de, adında tek bir mesaj tanımladık greetings. Mesaj, aranan servise gönderilir.HelloWorldService koşuyor http://localhost:9090/HelloServerPort.

Bununla birlikte şimdi sunucu geliştirmeye geçeceğiz. Sunucuyu geliştirmeden önce web servisimize Apache CXF arayüzü oluşturmamız gerekiyor. Bu verilen wsdl'den yapılacak. Bunu yapmak için adlı bir araç kullanırsınızwsdl2java.

Wsdl2java Eklentisi

Projeyi oluşturmak için maven kullanacağımızdan, aşağıdaki eklentiyi pom.xml dosya.

<plugins>
   <plugin>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-codegen-plugin</artifactId>
      <version>3.3.0</version>
      <executions>
         <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <configuration>
               <wsdlOptions>
                  <wsdlOption>
                     <wsdl>src/main/resources/hello.wsdl</wsdl>
                     <faultSerialVersionUID> 1 </faultSerialVersionUID>
                  </wsdlOption>
               </wsdlOptions>
            </configuration>
            <goals>
               <goal>wsdl2java</goal>
            </goals>
         </execution>
      </executions>
   </plugin>
</plugins>

Unutmayın ki konumun wsdl olarak dosyala src/main/resources/Hello.wsdl. Projeniz için uygun bir dizin yapısı oluşturduğunuzdan ve daha önce gösterilenleri eklediğinizden emin olmalısınız.hello.wsdl dosyayı belirtilen klasöre.

wsdl2javaeklenti bu wsdl'yi derleyecek ve önceden tanımlanmış bir klasörde Apache CXF sınıfları oluşturacaktır. Tam proje yapısı, hazır referansınız için burada gösterilmektedir.

Şimdi, kullanarak bir sunucu oluşturmaya hazırsınız. wsdl2javaoluşturulan sınıflar. Wsdl2java'nın oluşturduğu sınıflar aşağıdaki şekilde gösterilmektedir -

Oluşturulan Servis Arayüzü

Oluşturulan sınıflar listesinde, bunlardan birinin Apache CXF arayüzü olduğunu fark etmiş olmalısınız - bu HelloWorldPortType.java. Bu dosyayı kod düzenleyicinizde inceleyin. Dosya içeriği, hazır referansınız için burada gösterilmektedir -

//HelloWorldPortType.java
package com.tutorialspoint.helloworld;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;
/**
* This class was generated by Apache CXF 3.3.0
* 2019-02-11T12:05:55.220+05:30
* Generated source version: 3.3.0
*
*/

@WebService(targetNamespace = "http://helloworld.tutorialspoint.com/",
   name = "HelloWorldPortType")
@XmlSeeAlso({ObjectFactory.class})
public interface HelloWorldPortType {
   @WebMethod
   @RequestWrapper(localName = "greetings", targetNamespace =
      "http://helloworld.tutorialspoint.com/", className =
      "com.tutorialspoint.helloworld.Greetings")
      @ResponseWrapper(localName = "greetingsResponse", targetNamespace =
         "http://helloworld.tutorialspoint.com/", className =
         "com.tutorialspoint.helloworld.GreetingsResponse")
   @WebResult(name = "return", targetNamespace =
      "http://helloworld.tutorialspoint.com/")
   public java.lang.String greetings(
      @WebParam(name = "arg0", targetNamespace =
      "http://helloworld.tutorialspoint.com/")
      java.lang.String arg0
   );
}

Arayüzün adı verilen bir yöntem içerdiğine dikkat edin greetings. Bu bizim wsdl'mizdeki bir mesaj tipiydi. wsdl2javaaracı, bu yöntemi oluşturulan arayüze ekledi. Şimdi, wsdl'nize yazdığınız mesaj ne olursa olsun, arayüzde buna karşılık gelen bir yöntemin üretileceğini anlayabilirsiniz.

Şimdi, göreviniz wsdl'nizde tanımladığınız çeşitli mesajlara karşılık gelen tüm bu yöntemleri uygulamak olacaktır. Önceki Apache CXF-First örneğinde, web hizmetimiz için bir Apache CXF arayüzü ile başladığımızı unutmayın. Bu durumda, Apache CXF arayüzü wsdl'den oluşturulur.

Servis Arayüzünü Uygulama

Servis arayüzünün uygulanması önemsizdir. Tam uygulama aşağıdaki listede gösterilmektedir -

//HelloWorldImpl.java
package com.tutorialspoint.helloworld;
public class HelloWorldImpl implements HelloWorldPortType {
   @Override
   public String greetings(String name) {
      return ("hi " + name);
   }
}

Kod, adı verilen tek arabirim yöntemini uygular greetings. Yöntem bir parametre alırstring yazın, başına bir "merhaba" mesajı ekler ve ortaya çıkan dizeyi arayana geri döndürür.

Ardından sunucu uygulamasını yazacağız.

Geliştirme Sunucusu

Sunucu uygulaması geliştirmek bir kez daha önemsiz. Burada sağlanan CXF'yi kullanacağızEndpointhizmetimizi yayınlamak için sınıf. Bu, aşağıdaki iki kod satırında yapılır -

HelloWorldPortType implementor = new HelloWorldImpl();
   Endpoint.publish("http://localhost:9090/HelloServerPort",
      implementor,
      new LoggingFeature());

İlk olarak, hizmet uygulama sınıfımızın bir nesnesini oluşturuyoruz - HelloWorldImpl. Ardından, bu referansı ikinci parametre olarakpublishyöntem. İlk parametre, hizmetin yayınlandığı adrestir - istemciler hizmete erişmek için bu URL'yi kullanır. Sunucu uygulamasının tüm kaynağı burada verilmiştir -

//Server.java
package com.tutorialspoint.helloworld;
import javax.xml.ws.Endpoint;
import org.apache.cxf.ext.logging.LoggingFeature;
public class Server {
   public static void main(String[] args) throws Exception {
      HelloWorldPortType implementor = new HelloWorldImpl();
      Endpoint.publish("http://localhost:9090/HelloServerPort",
         implementor,
         new LoggingFeature());
      System.out.println("Server ready...");
      Thread.sleep(5 * 60 * 1000);
      System.out.println("Server exiting");
      System.exit(0);
   }
}

Bu sunucu sınıfını oluşturmak için, klasörünüze bir yapı profili eklemeniz gerekir. pom.xml. Bu aşağıda gösterilmiştir -

<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.helloworld.Server
                     </mainClass>
                  </configuration>
               </execution>
            </executions>
         </plugin>
      </plugins>
   </build>
   <dependencies>
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-transports-http-jetty</artifactId>
         <version>3.3.0</version>
      </dependency>
   </dependencies>
</profile>

Tam nitelikli adın Serversınıf konfigürasyonda belirtilmiştir. Ayrıca, bağımlılık etiketi, sunucu uygulamamızı dağıtmak için gömülü jetty web sunucusunu kullanacağımızı belirtir.

Sunucuyu Dağıtma

Son olarak, sunucu uygulamasını dağıtmak için, uygulamanızı bir web uygulaması olarak kurmak için pom.xml'de bir değişiklik daha yapmanız gerekecektir. Eklemeniz gereken kodpom.xml aşağıda verilmiştir -

<defaultGoal>install</defaultGoal>
<pluginManagement>
   <plugins>
      <plugin>
         <artifactId>maven-war-plugin</artifactId>
         <version>3.2.2</version>
         <configuration>
            <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
            <webResources>
               <resource>
                  <directory>src/main/resources</directory>
                  <targetPath>WEB-INF</targetPath>
                  <includes>
                     <include>*.wsdl</include>
                  </includes>
               </resource>
            </webResources>
         </configuration>
      </plugin>
   </plugins>
</pluginManagement>

Uygulamayı dağıtmadan önce, projenize iki dosya daha eklemeniz gerekir. Bunlar aşağıdaki ekran görüntüsünde gösterilmektedir -

Bu dosyalar, eşlemeyi tanımlayan CXF standart dosyalarıdır. CXFServlet. İçindeki kodweb.xml dosya burada hızlı başvuru için gösterilmektedir -

//cxf-servlet.xml
<web-app xmlns = "http://java.sun.com/xml/ns/javaee"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" version="2.5"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
   <display-name>cxf</display-name>
   <servlet>
      <description>Apache CXF Endpoint</description>
      <display-name>cxf</display-name>
      <servlet-name>cxf</servlet-name>
      <servlet-class>
         org.apache.cxf.transport.servlet.CXFServlet
      </servlet-class>
      <load-on-startup>1</load-on-startup>
   </servlet>
   <servlet-mapping>
      <servlet-name>cxf</servlet-name>
      <url-pattern>/services/*</url-pattern>
   </servlet-mapping>
   <session-config>
      <session-timeout>60</session-timeout>
   </session-config>
</web-app>

İçinde cxf-servlet.xmlhizmetinizin uç noktası için özellikleri bildirirsiniz. Bu, aşağıdaki kod pasajında ​​gösterilmektedir -

<beans ...>
   <jaxws:endpoint xmlns:helloworld = "http://tutorialspoint.com/"
      id="helloHTTP"
      address = "http://localhost:9090/HelloServerPort"
      serviceName = "helloworld:HelloServiceService"
      endpointName = "helloworld:HelloServicePort">
   </jaxws:endpoint>
</beans>

Burada hizmet uç noktamızın kimliğini, hizmetin kullanılabileceği adresi, hizmet adını ve uç nokta adını tanımlarız. Artık hizmetinizin bir CXF sunucu uygulaması tarafından nasıl yönlendirildiğini ve işlendiğini anlıyorsunuz.

Son pom.xml

pom.xmlbirkaç tane daha bağımlılık içerir. Tüm bağımlılıkları açıklamak yerine, aşağıya pom.xml'nin son sürümünü ekledik -

<?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-wsdl</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>
   <build>
      <defaultGoal>install</defaultGoal>
      <pluginManagement>
         <plugins>
            <plugin>
               <artifactId>maven-war-plugin</artifactId>
               <version>3.2.2</version>
               <configuration>
                  <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
                  <webResources>
                     <resource>
                        <directory>src/main/resources</directory>
                        <targetPath>WEB-INF</targetPath>
                        <includes>
                           <include>*.wsdl</include>
                        </includes>
                     </resource>
                  </webResources>
               </configuration>
            </plugin>
         </plugins>
      </pluginManagement>
      <plugins>
         <plugin>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-codegen-plugin</artifactId>
            <version>3.3.0</version>
            <executions>
               <execution>
                  <id>generate-sources</id>
                  <phase>generate-sources</phase>
                  <configuration>
                     <wsdlOptions>
                        <wsdlOption>
                           <wsdl>src/main/resources/Hello.wsdl</wsdl>
                           <faultSerialVersionUID>1</faultSerialVersionUID>
                        </wsdlOption>
                     </wsdlOptions>
                  </configuration>
                  <goals>
                     <goal>wsdl2java</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>
      </plugins>
   </build>
   <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.helloworld.Server
                           </mainClass>
                        </configuration>
                     </execution>
                  </executions>
               </plugin>
            </plugins>
         </build>
         <dependencies>
            <dependency>
               <groupId>org.apache.cxf</groupId>
               <artifactId>cxf-rt-transports-http-jetty</artifactId>
               <version>3.3.0</version>
            </dependency>
         </dependencies>
      </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.helloworld.Client
                           </mainClass>
                        </configuration>
                     </execution>
                  </executions>
               </plugin>
            </plugins>
         </build>
      </profile>
   </profiles>
   <dependencies>
      <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-http</artifactId>
         <version>3.3.0</version>
      </dependency>
      
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-management</artifactId>
         <version>3.3.0</version>
      </dependency>
      
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-features-metrics</artifactId>
         <version>3.3.0</version>
      </dependency>
      
      <dependency>
         <groupId>org.apache.cxf.xjc-utils</groupId>
         <artifactId>cxf-xjc-runtime</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.codehaus.mojo</groupId>
         <artifactId>exec-maven-plugin</artifactId>
         <version>1.6.0</version>
      </dependency>
      
      <dependency>
         <groupId>org.slf4j</groupId>
         <artifactId>slf4j-api</artifactId>
         <version>1.8.0-beta2</version>
      </dependency>
      
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-transports-http-jetty</artifactId>
         <version>3.3.0</version>
      </dependency>
   </dependencies>
</project>

Ayrıca, ilerideki bölümlerde yakında öğreneceğimiz müşteri oluşturmak için bir profil içerdiğini unutmayın.

HelloWorld Hizmetini Çalıştırmak

Artık web uygulamasını çalıştırmaya hazırsınız. Komut penceresinde, aşağıdaki komutu kullanarak derleme komut dosyasını çalıştırın.

mvn clean install

Bu, wsdl'nizden uygun Apache CXF sınıflarını oluşturacak, Apache CXF sınıflarınızı derleyecek, sunucuyu gömülü jetty sunucusuna yerleştirecek ve uygulamanızı çalıştıracaktır.

Konsolda aşağıdaki mesajı göreceksiniz -

INFO: Setting the server's publish address to be 
http://localhost:9090/HelloServerPort
Server ready...

Daha önce olduğu gibi, tarayıcınızda sunucu URL'sini açarak sunucuyu test edebilirsiniz.

Herhangi bir işlem belirtmediğimiz için, uygulamamız tarafından tarayıcıya sadece bir hata mesajı dönmektedir. Şimdi eklemeyi deneyin?wsdl URL'nize ve aşağıdaki çıktıyı göreceksiniz -

Yani sunucu uygulamamız beklendiği gibi çalışıyor. SOAP İstemcisini aşağıdaki gibi kullanabilirsiniz:Postman hizmetinizi daha ayrıntılı test etmek için daha önce açıklanmıştır.

Bu öğreticinin bir sonraki kısmı, hizmetimizi kullanan bir müşteri yazmaktır.

Müşteri Geliştirme

İstemciyi bir CXF uygulamasında yazmak, bir sunucu yazmak kadar önemlidir. Esasen yalnızca üç satırdan oluşan istemci için eksiksiz kod, geri kalan satırlar yalnızca hizmet bilgilerini kullanıcıya yazdırır.

//Client.java
package com.tutorialspoint.helloworld;
public class Client {
   public static void main(String[] args) throws Exception {
      //Create the service client with its default wsdlurl
      HelloWorldService helloServiceService = new HelloWorldService();
      System.out.println("service: " +
         helloServiceService.getServiceName());
      System.out.println("wsdl location: " +
         helloServiceService.getWSDLDocumentLocation());
      HelloWorldPortType helloService =
         helloServiceService.getHelloWorldPort();
      System.out.println(helloService.greetings
      (System.getProperty("user.name")));
   }
}

Burada, hizmetimizin bir örneğini oluşturuyoruz HelloWorldService, arayarak limanını alın getHelloWorldPort yöntemi ve sonra bizim greetingsona mesaj. İstemciyi çalıştırın ve aşağıdaki çıktıyı göreceksiniz -

service: {http://helloworld.tutorialspoint.com/}HelloWorldService
wsdl location: file:/Users/drsarang/Desktop/tutorialpoint/cxf-
wsdl/src/main/resources/Hello.wsdl
hi drsarang

Şimdiye kadar CXF'yi Apache CXF-First ve WSDL-First mimarileriyle nasıl kullanacağınızı öğrendiniz. Apache CXF-First yaklaşımında, bir POJO kullandınız.ServerFactoryBeanbir sunucu oluşturmak için CXF kitaplıklarından sınıf. Kullandığınız bir müşteri oluşturmak içinClientProxyFactoryBeanCXF kütüphanesinden sınıf. WSDL-First yaklaşımında, kullandınızEndpointhizmeti istenen URL'de ve belirli bir uygulayıcıda yayınlamak için sınıf. Artık bu teknikleri farklı protokolleri ve taşımaları entegre etmek için genişletebilirsiniz.

Bu bölüme geçmeden önce, Java'da bir RESTful web servisinin nasıl yazılacağını bildiğinizi varsayıyoruz. Bu JAX-RS (RESTful Web Hizmetleri için Java API) üzerine CXF'yi nasıl kullanacağınızı göstereceğim. En son filmlerin bir listesini tutan bir web hizmeti oluşturacağız. Kullanıcı bir film istediğinde, isteğinde film kimliğini belirtir, sunucu filmi bulur ve istemciye iade eder. Önemsiz durumumuzda, gerçek ikili MP4 dosyasını değil, sadece film adını istemciye iade edeceğiz. Öyleyse bir JAX-RS uygulaması oluşturmaya başlayalım.

Film Öğesini Bildirme

Verilen bir filmin kimliğini ve adını saklamak için Movie adında bir XML kök öğesi ilan edeceğiz. Öğe, Movie.java adlı bir dosyada bildirilir. Dosyanın içeriği burada gösterilir -

//Movie.java
package com.tutorialspoint.cxf.jaxrs.movie;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "Movie")
public class Movie {
   private long id;
   private String name;
   public long getId() {
      return id;
   }
   public void setId(long id) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}

Kullanımına dikkat edin XmlRootElement XML öğesini bildiren etiketi Movieetiket. Ardından, filmlerin listesini veritabanında tutan bir hizmet oluşturacağız.

Film Hizmeti Veritabanı Oluşturma

Java ile verilen filmlerin listesini saklamak için Mapanahtar / değer çiftlerini depolayan. Liste büyükse, yönetimi daha kolay olacak harici bir veritabanı depolama alanı kullanacaksınız. Önemsiz durumumuzda, veritabanımızda sadece beş film saklayacağız. MovieService sınıfının kodu aşağıda verilmiştir -

//MovieService.java
package com.tutorialspoint.cxf.jaxrs.movie;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
@Path("/movieservice/")
@Produces("text/xml")
public class MovieService {
   long currentId = 123;
   Map<Long, Movie> movies = new HashMap<>();
   public MovieService() {
      init();
   }
   @GET
   @Path("/movie/{id}/")
   public Movie getMovie(@PathParam("id") String id) {
      long idNumber = Long.parseLong(id);
      return movies.get(idNumber);
   }
   final void init() {
      Movie c1 = new Movie();
      c1.setName("Aquaman");
      c1.setId(1001);
      movies.put(c1.getId(), c1);
      
      Movie c2 = new Movie();
      c2.setName("Mission Imposssible");
      c2.setId(1002);
      movies.put(c2.getId(), c2);
      
      Movie c3 = new Movie();
      c3.setName("Black Panther");
      c3.setId(1003);
      movies.put(c3.getId(), c3);
      
      Movie c4 = new Movie();
      c4.setName("A Star is Born");
      c4.setId(1004);
      movies.put(c4.getId(), c4);
      
      Movie c5 = new Movie();
      c5.setName("The Meg");
      c5.setId(1005);
      movies.put(c5.getId(), c5);
   }
}

Film hizmetimiz için URL yolunu ve dönüş türünü belirtmek için aşağıdaki iki ek açıklamayı kullandığımızı unutmayın -

@Path("/movieservice/")
@Produces("text/xml")

GET isteğinin URL'sini belirtmek için @GET ve @Path ek açıklamalarını aşağıdaki gibi kullanıyoruz -

@GET
@Path("/movie/{id}/")

Film veritabanının kendisi, veritabanına beş film öğesi eklediğimiz init yönteminde başlatılır.

Bir sonraki görevimiz bir sunucu uygulaması yazmak.

Geliştirme Sunucusu

Bir sunucu oluşturmak için, sağlanan CXF kullanıyoruz JAXRSServerFactoryBean sınıf.

JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();

Kaynak sınıflarını, setResourceClasses yöntem.

factory.setResourceClasses(Movie.class);
factory.setResourceClasses(MovieService.class);

Servis sağlayıcıyı arayarak ayarladık setResourceProvider yöntem.

factory.setResourceProvider(MovieService.class,
new SingletonResourceProvider(new MovieService()));

İstenileni ayarladık publish adresini arayarak aetAddress yöntem -

factory.setAddress("http://localhost:9000/");

Son olarak, Create metodunu çağırarak sunucuyu yayınlıyoruz. factory örnek.

factory.create();

Sunucu uygulaması için kodun tamamı aşağıda verilmiştir -

//Server.java
package com.tutorialspoint.cxf.jaxrs.movie;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
public class Server {
   public static void main(String[] args) throws Exception {
      JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();
      factory.setResourceClasses(Movie.class);
      factory.setResourceClasses(MovieService.class);  
      factory.setResourceProvider(MovieService.class,
         new SingletonResourceProvider(new MovieService()));
      factory.setAddress("http://localhost:9000/");
      factory.create();
      
      System.out.println("Server ready...");
      Thread.sleep(5 * 60 * 1000);
      
      System.out.println("Server exiting ...");
      System.exit(0);
   }
}

Son pom.xml

Burada pom.xml'nin son sürümünü aşağıya ekledik -

<?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-jaxrs</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.cxf.jaxrs.movie.Server
                           </mainClass>
                        </configuration>
                     </execution>
                  </executions>
               </plugin>
            </plugins>
         </build>
         <dependencies>
            <dependency>
               <groupId>org.apache.cxf</groupId>
               <artifactId>cxf-rt-transports-http-jetty</artifactId>
               <version>3.3.0</version>
            </dependency>
         </dependencies>
      </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.cxf.jaxrs.movie.Client
                           </mainClass>
                        </configuration>
                     </execution>
                  </executions>
               </plugin>
            </plugins>
         </build>
      </profile>
   </profiles>
   <dependencies>
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-transports-http</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>
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-frontend-jaxrs</artifactId>
         <version>3.3.0</version>
         </dependency>
      <dependency>
         <groupId>jakarta.ws.rs</groupId>
         <artifactId>jakarta.ws.rs-api</artifactId>
         <version>2.1.5</version>
      </dependency>
      <dependency>
         <groupId>org.apache.httpcomponents</groupId>
         <artifactId>httpclient</artifactId>
         <version>4.5.7</version>
      </dependency>
   </dependencies>
</project>

Müşteri Geliştirme

RS istemcisini yazmak önemsizdir. Sadece bir URL nesnesi oluşturuyoruz ve onun akışını açıyoruz. Girdi akışının içeriğini yerel bir akışa kopyalamak için CXF tarafından sağlanan IOUtils sınıfını kullanıyoruz.

URL url = new URL("http://localhost:9000/movieservice/movie/1002");
try (InputStream instream = url.openStream();
CachedOutputStream outstream = new CachedOutputStream()) {
   IOUtils.copy(instream, outstream);
}

İstemci uygulaması için kodun tamamı aşağıda verilmiştir -

//Client.java
package com.tutorialspoint.cxf.jaxrs.movie;
import java.io.InputStream;
import java.net.URL;
import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.io.CachedOutputStream;
public class Client {
   public static void main(String[] args) throws Exception {
      URL url = new URL("http://localhost:9000/movieservice/movie/1002");
      try (InputStream instream = url.openStream();
      CachedOutputStream outstream = new CachedOutputStream()) {
         IOUtils.copy(instream, outstream);
         String str = outstream.getOut().toString();
         System.out.println(str);
      }
   }
}

JAX-RS Uygulamasının Test Edilmesi

Komut satırı penceresinde aşağıdaki komutu kullanarak sunucuyu çalıştırın -

mvn -Pserver

Şimdi, konsolda aşağıdaki mesajı göreceksiniz -

INFO: Setting the server's publish address to be http://localhost:9000

Şimdi tarayıcınızı açın ve aşağıdaki URL'yi yazın -

http://localhost:9000/movieservice/movie/1002

Tarayıcı penceresinde aşağıdakileri göreceksiniz.

Aşağıdaki komutu ayrı bir komut satırı penceresinde çalıştırarak geliştirdiğimiz bir Java istemci uygulamasını kullanarak servisi çağırabilirsiniz.

mvn -Pclient

Aşağıdaki çıktıyı göreceksiniz -

<?xml version="1.0" encoding = "UTF-8" standalone="yes"?>
<Movie><id>1002</id><name>Mission Imposssible</name></Movie>

CXF örnekleri, CXF'nin JAX-RS ile nasıl kullanılacağına dair birkaç örnek sağlar. İlgilenen okuyucular bu örnekleri incelemeye teşvik edilir.

Daha önce 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ıştığınız önceki tüm 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 herhangi bir başka 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 oluşturduk -

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ızdan, 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 ayarlıyoruz -

factory.setTransportId (JMSSpecConstants.SOAP_JMS_SPECIFICATION_TRANSPORTID);
factory.setAddress (JMS_ENDPOINT_URI);
HelloWorld client = factory.create(HelloWorld.class);

Son olarak, hizmet yöntemini çağırıyoruz ve sonuçtaki çı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);
   }
}

Apache CXF - Sonuç

CXF, web uygulamaları oluşturmak için günümüz dünyasında var olan çeşitli web protokollerini ve aktarımlarını karıştırmak için birleşik bir yaklaşım sağlar. CXF kullanan bir web uygulaması oluşturmak için geleneksel bir Java arayüzüyle nasıl başlayacağınızı öğrendiniz. Ardından, WSDL ile başlayarak bir web uygulamasının ve istemcisinin nasıl oluşturulacağını öğrendiniz.

WSDL, hizmet arabiriminizin XML temsilini sağlar. WSDL'den Java arabirimleri oluşturmak için wsdl2java aracını kullandınız ve sonunda oluşturulan arabirimleri kullanarak hem sunucuyu hem de istemciyi yazdınız. Eğitimde ayrıca kısaca RESTful web hizmeti uygulamanızda CXF kullanımı hakkında bilgi verilmiştir. Son olarak, CXF'nin JMS ile nasıl kullanılabileceğini de tartıştık. Şimdi daha fazla çalışma için CXF örneklerine başvurabilirsiniz .

Note - Proje kaynak kodunun tamamı buradan indirilebilir.