JBoss Fuse 快速指南



JBoss Fuse - ESB 簡介

在本章中,我們將從企業服務匯流排 (ESB) 的基礎知識開始。下面是對 ESB 的詳細解釋,包括其優點、缺點和一些便於理解的圖表。

什麼是 ESB?

ESB 代表企業服務匯流排。ESB 最簡單的形式是一種中介軟體,它充當資訊高速公路,幫助多個應用程式進行通訊。

在企業世界中,我們為許多事情開發解決方案。這些解決方案可能使用不同的技術和不同的資料格式。由於這些技術的通訊或資料格式的相容性差異,將這些解決方案一起使用變得很麻煩。因此,我們需要一種技術來允許這些不同解決方案之間的**鬆散耦合整合**。

ESB 旨在透過成為位於所有應用程式中間的“中心”,並促進它們之間的訊息路由來簡化這一整合問題。ESB 充當調解器,充當資訊高速公路,負責資料轉換路由,讓程式設計師或開發人員專注於自己的應用程式邏輯。

當我們理解 ESB 為其專門設計的問題時,理解 ESB 就變得非常簡單,解決方案也變得容易。應該清楚地瞭解如何啟用許多不同的系統(使用不同的語言編寫,並在使用不同資料格式的不同機器上執行)來共享資訊並形成一個整合的業務平臺。

整合問題

在企業平臺中,多個應用程式協同工作並整體提供業務功能是很常見的,但這些應用程式的整合是最經常出現的問題。隨著應用程式的增長,這個問題會變得更加困難。

每個應用程式都可以使用自己的格式輸入和輸出資料。如果應用程式的數量較少,這種方法效果很好,但是隨著應用程式數量的增加,整合方法也需要改進。例如,如果業務的特定應用程式需要更改,則所有依賴於該主應用程式的應用程式的輸出或輸入資料格式都會受到影響。

這種方法是整合面臨的最大障礙,它需要緊密耦合的架構。這就是 ESB 發揮作用的地方。每個應用程式不需要直接與其他應用程式通訊;相反,所有應用程式都與 ESB 通訊,ESB 處理資訊的路由和內部資料格式轉換。

Integration Problem

為什麼選擇 ESB?

以下是解釋為什麼企業服務匯流排必不可少的一些要點。

  • ESB 旨在簡化與具有不同相容性應用程式的整合問題。

  • 它充當中介軟體,充當所有應用程式的調解器,並促進它們之間的訊息路由。

  • 每個應用程式不再直接與其他每個應用程式互動,現在每個應用程式只有一個與 ESB 的介面。

  • ESB 負責將訊息轉換為/從通用格式轉換,並將其路由到其目的地。

  • 如果必須替換任何現有應用程式,這種方法的主要節省將成為一大優勢。您不必編寫大量新的介面,而只需關注一個介面(應用程式和 ESB 之間的介面)。

ESB

SOA 與 ESB?

SOA 和 ESB 通常可以互換使用,但它們完全不同。

SOA 是一種設計模式,它允許應用程式透過通訊協議在網路上公開其功能作為服務,而 ESB 是一種促進不同系統之間通訊的模型,但是 ESB 可以用作實施 SOA 的主幹。

什麼是 Fuse?

JBoss Fuse 是 Red Hat 的開源 ESB 解決方案。它是一個基於社群專案 Apache Servicemix 的企業解決方案。

與 Fuse 整合

JBoss Fuse 是一個輕量級且靈活的整合平臺,允許快速整合企業應用程式。

Fuse 最初由 Progressive Software Inc. 開發,該公司於 2012 年被 Red Hat 收購。JBoss Fuse 6.1.0.redhat-379 GA 是 Fuse 的穩定版本,可以從其官方網站下載。

架構

Fuse 將各種技術組合在一起作為單個產品。

Architecture

元件

Apache CXF

Apache CXF 是一個開源 Web 服務開發框架,它也支援 SOAP 和 REST Web 服務的開發。

Apache Camel

Apache Camel 是一個基於 EIP 的整合框架。EIP 或企業整合模式是企業整合中反覆出現問題的已識別解決方案。使用這些預定義的開箱即用模式的組合,可以迅速實現完整的整合解決方案。

它允許使用多種領域特定語言(如 Java、Spring DSL 和 Scala 等)編寫路由邏輯。

Apache AMQ

Apache AMQ 是一個 JMS,它根據 JMS 標準提供可靠的訊息傳遞系統。它不僅支援 JMS 規範,還提供 JMS 規範中未包含的一些令人興奮且有用的功能。

Apache Karaf

Apache Karaf 是一個輕量級的 OSGi 容器,充當工件的執行時環境。與 JVM 相比,Apache Karaf 更具動態性。它允許在執行時安裝或解除安裝模組。Fuse 中的所有工件都部署在 Karaf 中。

Fabric

Fabric 提供了一種簡單的方法來管理大型分散式環境中工件的部署。它為所有多個 Fuse 例項提供集中式管理。

安裝 Fuse

安裝 Fuse 非常簡單。與其他 JBoss 產品一樣,Fuse 以 zip 檔案的形式提供,可以解壓縮,並且在進行一些小的配置更改後可以直接啟動。

安裝 Fuse 是一個四步過程:

下載

從以下連結下載 Fuse 6.1.0 GA。http://www.jboss.org/

解壓縮

與所有其他 JBoss 產品一樣,Fuse 也是一個平臺無關的 zip 檔案。

將下載的檔案解壓縮到您希望作為 Fuse 安裝目錄的目標目錄中。明智地選擇此目錄,因為它應該在 Fuse 例項的整個生命週期中保持不變。

**注意** - 即使 Fuse 的解壓縮和啟動方式與其他 JBoss 產品一樣,也不建議在安裝完成後將 Fuse 安裝從一個位置移動到另一個位置。

配置

解壓縮 Fuse 後,您將在解壓縮的目錄中找到以下目錄:

  • bin
  • etc
  • deploy
  • lib
  • licenses
  • extras
  • quickstarts

我們將只使用其中的兩個目錄**bin** 和**etc**。

實際上,在解壓縮 Fuse 後,我們應該能夠直接啟動 Fuse,但這將使用所有預設配置啟動 Fuse,這對於生產環境是不建議的。強烈建議在啟動 Fuse 之前進行以下更改。

設定環境變數

  • 設定以下環境變數 – **JAVA_HOME**

  • 該變數應指向 Java 安裝目錄 – **M2_HOME**

  • 該變數應指向 Maven 安裝目錄 – **PATH**

  • 設定路徑變數以包含 Java 和 Maven 可執行檔案。

Windows

在 Windows 上,可以透過以下說明進行設定:

開始→我的電腦→右鍵單擊→屬性→高階系統設定→環境變數。

UNIX 和克隆系統

對於每個使用者,在 *nix 作業系統中都有一個 bash 配置檔案。我們可以透過更改此檔案來新增或編輯現有的系統變數。

$ vi ~/.bash_profile

**注意** - 此檔案的任何更改都是永久性的。強烈建議在更改原始檔案之前備份現有檔案。

基本配置

我們將討論 JBoss Fuse 的基本配置,為此,我們必須從以下命令開始 **Edit $FUSE_INSTALLATION_DIR/etc/**

  • 在 **user.properties** 中

    • #admin=admin,admin

    • 這需要根據我們想要的第一個管理員使用者名稱進行更改,第二個管理員密碼,第三個可能保持不變,因為它表示一個角色,並且不要忘記刪除 #

    • 例如 – FuseAdmin = FusePAss,admin

Basic Configuration
  • 在 **system.properties** 中

    • karafName = root

      • 這指示您要為 Karaf 例項指定的名稱。

      • 我們可以將其命名為任何我們想要的名稱,例如 Cont1。

      • 確保您指定的名稱是唯一的名稱,並且尚未被另一個 Fuse 例項使用。

  • 在 **org.ops4j.pax.web.cfg** 中

    • org.osgi.service.http.port = 8181

    • 此屬性指示要用於訪問 Fuse 提供的基於瀏覽器的介面 HAWTIO 的埠

    • HAWTIO 是從 6.0 版本開始提供的 Fuse 的內建瀏覽器介面

  • 在 **org.ops4j.pax.url.mvn.cfg** 中

    • org.ops4j.pax.url.mvn.localRepository = D:/repository

    • 此屬性指示 Maven 的本地儲存庫的路徑,Fuse 將從中安裝其工件。

    • org.ops4j.pax.url.mvn.settings = D:/Maven/conf/settings.xml

    • 此屬性指示 Fuse 應該使用的 settings.xml,以從 Maven 獲取工件。

配置 Maven

Maven 是安裝 Fuse 的先決條件。如果您不知道 Maven 是什麼,請參考 https://tutorialspoint.tw/maven/

Maven 是用於構建 Fuse 工件的構建工具。當我們發出安裝工件的命令時,Fuse 首先在 Maven 本地儲存庫中搜索工件。因此,我們必須讓 Fuse 知道 Maven 的安裝位置和 Maven 本地儲存庫的路徑。

編輯 $FUSE_INSTALLATION_DIR/etc/ **org.ops4j.paxurl.mvn.cfg**

更新以下兩個屬性:

  • org.ops4j.pax.url.mvn.settings = $M2_HOME/conf/settings.xml
  • org.ops4j.pax.url.mvn.localRepository = $local_repo

**注意** - 請將 **$local_repo** 更改為 Maven settings.xml 中提到的本地儲存庫的實際路徑。

執行

完成基本的配置更改後,我們現在可以啟動Fuse。所有與Fuse一起使用的二進位制檔案都位於$FUSE_INSTALLATION_DIR

啟動Fuse有兩種方法:

  • 使用./fuse

    • 這將允許您在啟動Fuse的同一視窗中檢視所有進度和日誌。

    • 它將在與下面所示相同的終端中提供Karaf控制檯。

注意:這將在控制檯模式下啟動Fuse,這意味著當用戶登出會話或關閉終端時,Fuse程序也將停止,這在生產或開發場景中是不希望的。此指令碼僅應用於除錯Fuse。

  • 使用./start

    • 這不會在螢幕上顯示任何日誌,甚至不會顯示進度,但這將在後臺啟動Fuse,並且當用戶退出會話或關閉終端時,Fuse服務不會停止。

    • 在實際應用程式中,需要這種行為。即使我們關閉終端,Fuse也應該在後臺執行。

    • 如果要連線到在後臺執行的Fuse,可以使用位於同一資料夾中的client指令碼。

    • 您應該獲得如下所示的顯示。

    • 退出客戶端指令碼不會停止Fuse服務。它只會關閉Fuse控制檯。

Configuring Maven

HAWTIO

Fuse還使用FMC(Fuse管理控制檯)提供對其的完整GUI訪問。您可以在以下URLhttps://:8181上找到GUI。

HAWTIO

透過執行命令所做的所有操作也可以透過訪問此基於瀏覽器的GUI來完成。當我們有多個容器並在Fabric環境中執行時,它變得非常有用。

JBoss Fuse - Apache Karaf

在本章中,我們將討論Apache Karaf,以及為什麼它被稱為輕量級OSGi容器,以及它的優點和其他重要特性。

JVM問題

JVM或Java虛擬機器並不充當實際的虛擬機器。一臺機器,允許您動態地停止、啟動或重新啟動在其內部執行的元件。它有時可能允許類級別的熱部署,但是您無法在虛擬機器中部署或解除安裝應用程式的元件而無需重新啟動它。

為了解決這個問題並在Java應用程式中允許模組化,Fuse使用基於OSGi的執行時,稱為Apache Karaf。

OSGi

OSGi技術是一組規範,定義了Java的動態元件系統。這些規範允許開發模型,其中應用程式由許多不同的(可重用)元件(動態地)組成。

OSGi的優點

  • 降低複雜性:應用程式構建為協作元件,這些元件彼此隱藏其實現細節,從而降低了複雜性。

  • 可重用性:許多元件可以利用部署在容器中的相同元件。

  • 部署:OSGi透過其生命週期管理API支援動態啟動、停止和更新元件,而無需重新啟動容器。

Bundle與Feature

以下是Bundle和Feature之間的比較。

Bundle

Bundle對於OSGi相當於JAR對於JVM。Bundle是在OSGi容器中可部署的工件。Bundle是協同工作或獨立工作以形成應用程式的元件。

這些Bundle可以在執行時安裝、解除安裝、更新、啟動或停止,而無需重新啟動容器。

Feature

Feature是一種將多個Bundle一起部署的方法。有時,將Bundle分組部署更有意義。Feature允許我們只需一個命令即可部署一組Bundle。

為什麼需要另一個容器?

Apache Karaf是一個基於OSGi的執行時,我們的應用程式Bundle就在其中執行。Fuse使用Apache Karaf作為其執行時,Bundle在其中執行並協作以提供業務功能。

Karaf構建在Felix和equinox之上,它們是OSGi框架。

Karaf架構

Karaf Architecture

Apache Karaf為基本的OSGi執行時添加了以下附加功能。

熱部署

Karaf支援熱部署。它包含一個熱部署目錄。放置在此目錄中的任何內容都將自動部署並作為Bundle安裝到Karaf中。

日誌記錄

Karaf透過在$Fuse_home/data/log中為所有Bundle生成日誌來提供集中式日誌記錄。我們可以在$Fuse_home/etc目錄中的org.ops4j.pax.logging.cfg中編輯日誌記錄器配置。

管理控制檯

Karaf提供了一個複雜而清晰的管理控制檯來與Fuse的執行例項進行互動。它還提供了一套預安裝的命令,可用於在執行時管理和監控元件(Bundle)。此控制檯是可擴充套件的,因此它允許我們透過向控制檯新增新的Bundle來向控制檯新增新命令。

Admin console

SSH訪問

Karaf允許透過SSH遠端訪問此管理控制檯。任何擁有有效憑據的人都可以透過SSH終端連線到Karaf管理控制檯。

JBoss Fuse - Apache Camel

在本章中,我們將討論什麼是Apache Camel以及它如何有效地在端點之間路由資料,以及一些示例。

什麼是Apache Camel?

Apache Camel是一個開源整合框架,於2007年初啟動。

它是一種基於EIP(企業整合模式)的方法,它提供了幾種現成的模式實現,可用於解決企業整合問題。EIP只不過是針對企業整合中記錄良好且反覆出現的問題的成熟解決方案。

Camel也稱為路由和中介引擎,因為它有效地在端點之間路由資料,同時承擔繁重的負載,例如資料格式轉換、端點連線等等。

基本示例

使用Apache Camel的先決條件:

  • Java
  • Maven
  • Redhat JBoss Fuse 6.1-GA-379

建立應用程式的基本框架

mvn:archetype generate 
–DgroupId = com.tutorialpoint.app 
–DartifactId = camel-first-app 
–DarchetypeGroupId = org.apache.camel.archetypes
–DarchetypeArtifactId = camel-archetype-spring 
–DinteractiveMode = false -X

這應該生成以下目錄結構。

Directory Structure

這是我們生成的Camel應用程式的基本框架。

編輯camel-context.xml

編輯camel-first-app → src → main → resources → META-INF\spring\camel-context.xml使其與以下內容匹配

<?xml version = "1.0" encoding = "UTF-8"?>
<!-- Configures the Camel Context-->
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans.xsd
   http://camel.apache.org/schema/spring
   http://camel.apache.org/schema/spring/camel-spring.xsd">

   <camelContext xmlns = "http://camel.apache.org/schema/spring">
      <!-- here is a sample which processes the input file
         (leaving them in place - see the 'noop' flag) 
         then performs content based routing on the message using XPath -->
			
      <route>
         <from uri = "file:///d:/src/data?noop=false"/>
         <choice>
            <when>
               <xpath>/person/city = 'London'</xpath>
               <log message = "UK message"/>
               <to uri = "file:///d:/target/messages/uk"/>
            </when>
				
            <otherwise>
               <log message = "Other message"/>
               <to uri = "file:///d:/target/messages/others"/>
            </otherwise>
				
         </choice>
			
      </route>
   </camelContext>
</beans>

編輯pom.xml

在<plugins></plugins>內新增以下程式碼:

<plugin>
   <groupId>org.apache.felix</groupId>
   <artifactId>maven-bundle-plugin</artifactId>
   <version>2.3.4</version>
   <extensions>true</extensions>
	
   <configuration>
      <instructions>
         <Bundle-SymbolicName>
            ${project.artifactId}
         </Bundle-SymbolicName>
         <Import-Package>*</Import-Package>
      </instructions>
   </configuration>
	
</plugin>

將打包型別從jar → bundle更改。

<packaging>bundle</packaging>

使用以下命令構建專案:

mvn clean install

將專案安裝到Fuse

使用Fuse.bat/start.bat啟動Fuse。如果使用start.bat啟動Fuse,請使用client.bat連線到Fuse。您應該獲得如下所示的UI。

Install Project in Fuse

這是用於訪問Karaf和Fuse命令的CLI。

install –s mvn:com.tutorialpoint.app/camel-firt-app/1.0-SNAPSHOT

測試您的專案是否正在執行

現在您的應用程式應該安裝在Fuse中。將camel-first-app內的data目錄複製並放置在D:/src/中,它應該將包含city = London的訊息複製到D:/target/merssages/uk

將輸入檔案放在D:/src/data

輸入

Message1.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<person user = "james">
   <firstName>James</firstName>
   <lastName>Strachan</lastName>
   <city>London</city>
</person>

Message2.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<person user = "hiram">
   <firstName>Hiram</firstName>
   <lastName>Chirino</lastName>
   <city>Tampa</city>
</person>

輸出

在D:/target/messages/uk

<?xml version = "1.0" encoding = "UTF-8"?>
<person user = "james">
   <firstName>James</firstName>
   <lastName>Strachan</lastName>
   <city>London</city>
</person>

在D:/target/messages/others

<?xml version = "1.0" encoding = "UTF-8"?>
<person user = "hiram">
   <firstName>Hiram</firstName>
   <lastName>Chirino</lastName>
   <city>Tampa</city>
</person>

JBoss Fuse - Camel概念

在本章中,我們將瞭解不同的Camel概念。讓我們從一個基本的例子開始,瞭解核心概念。

CamelContext

每個Camel應用程式至少都有一個CamelContext。這是我們新增Camel路由的地方。它類似於Spring的ApplicationContext

Camel context可以被認為是一個容器,它將所有東西整合在一起。一個Camel context可以在其中包含多個路由。

路由

CamelContext可以包含一個或多個路由。路由是整合邏輯,它定義了資料如何在Camel context中從一個端點流向另一個端點。

端點

端點是通道的末端,系統可以透過它傳送或接收訊息。這就是我們在通訊語言中所說的目的地或來源。

元件

元件是Camel中的擴充套件點。元件可以是技術、資料格式、轉換器等的介面。它們也可以充當端點的工廠。

Components

EIP

EIP代表企業整合模式。這些是針對重複出現的問題的已識別和眾所周知的解決方案。Camel支援大多數企業整合模式。

基於內容的路由器

CBR模式允許我們根據輸入檔案的內容路由資料。

Content Based Router

當我們必須根據輸入正文的內容路由值時,使用此模式。

以下示例將從D:/data/input目錄讀取資料。讀取後,它將檢查data標籤內的value標籤。如果value標籤包含value1,它將被髮送到D:/value1,如果它包含value2,它將被髮送到D:/value2,如果兩者都不包含,則它將被髮送到others。

<CamelContext xmlns = "http://camel.apache.org/schema/spring">
   <route>
      <from uri = "file:///D:/data/input"/>
      <choice>
         <when>
            <xpath>/data/value = 'value1'</xpath>
            <to uri = "file:///D:/value1"/>
         </when> 
         <when>
            <xpath>/data/value = 'value2'</xpath>
            <to uri = "file:///D:/value2"/>
         </when>  
			
         <otherwise>
            <to uri = "file:///D:/others "/>
         </otherwise>
			
      </choice>
   </route>
</camelContext>

輸入

D:/data/input/message1.xml

<data>
   <value>value1</value>
</data>

D:/data/input/message2.xml

<data>
   <value>value2</value>
</data>

輸出

D:/value1/

<data>
   <value>value1</value>
</data>

D:/value2/

<data>
   <value>value2</value>
</data>

拆分器

拆分器模式用於將輸入資料拆分為較小的塊。

Splitter

此模式通常與需要拆分成塊的大量輸入資料一起使用,因此它變得可處理。它根據輸入標記字串將輸入分解成較小的片段。

<CamelContext xmlns = "http://camel.apache.org/schema/spring">
   <route>
      <from uri = "file:///D:/inbox"/>
      <split streaming = "true">
         <tokenize token = "order" xml = "true"/>
         <to uri = "activemq:queue:order"/>
      </split>
   </route>
</CamelContext>

輸入

D:/inbox/message.xml

<order>
   <data>
      <value>value1</value>
   </data>
</order>

<order>
   <data>
      <value>value2</value>
   </data>
</order>

<order>
   <data>
      <value>value3</value>
   </data>
</order>

輸出

如果檢查AMQ,您會發現釋出了3條訊息。

<order>
   <data>
      <value>value4</value>
   </data>
</order>

收件人列表

當需要從訊息正文字身檢索收件人列表時,使用收件人列表模式。

Recipient List

在以下示例中,一條訊息將傳送給在customer標籤中列出的所有收件人,這些收件人是逗號分隔的字串列表。

<CamelContext xmlns = "http://camel.apache.org/schema/spring">
   <route>
      <from uri = "jms:xmlOrders" />
      <recipientList>
         <xpath>/order/customer</xpath>
      </recipientList>
   </route>
</camelContext>

其他EIP

Camel幾乎支援所有已識別的EIP。一些常用的EIP如下所示。

  • 日誌:記錄完整訊息或部分訊息

  • 訊息過濾器:過濾訊息內容

  • 重新排序器:按順序獲取所有標記

  • Wiretap:檢查正在傳輸的訊息

EIP的完整列表及其用法可以在Camel的官方文件中找到 http://camel.apache.org/eip.html

Camel中的異常處理

使用錯誤處理程式:這是處理Camel中異常的最簡單方法。

要使用此方法,我們必須配置錯誤處理程式類bean並將其作為引用提供給CamelContext errorHandlerRef屬性。

<bean id = "loggingErrorHandler" class = "org.apache.camel.builder.LoggingErrorHandler">
   <property name = "logName" value = "mylogger.name"/>
   <property name = "level" value = "DEBUG"/>
</bean>

<camelContext errorHandlerRef = ” loggingErrorHandler” >
   …
</camelContext>

使用Try Catch Finally

Camel還支援Java風格的Try Catch Finally塊進行錯誤處理。

就像Java一樣,它具有以下三個塊:

  • doTry塊包含可能生成異常的程式碼。

  • doCatch塊包含在發生異常時需要執行的程式碼。

  • doFinally塊包含必須執行的程式碼,無論是否發生異常。無論是否引發異常,它都將始終執行。

注意:Mock是測試元件,不建議用於其他目的。它是Camel中用於測試的元件,就像測試驅動開發中的jMOck元件一樣。

<route>
   <from uri = "direct:start"/>
   <doTry>
      <process ref = "someProcesorThatmayFail"/>
      <to uri = "mock:result"/>
		
      <doCatch>
         <exception>java.io.IOException</exception>
         <exception>java.lang.IllegalStateException</exception>
         <to uri = "mock:catch"/>
      </doCatch>
		
      <doFinally>
         <to uri = "mock:finally"/>
      </doFinally>
		
   </doTry>
</route>

在上面的示例中,我們可以提供catch塊需要處理的異常列表。

在Fuse中部署Bundle

使用Fuse.bat/start.bat啟動Fuse。

如果使用start.bat啟動Fuse,請使用client.bat連線到Fuse。您應該獲得如下所示的UI。

Deploying Bundle in Fuse

這是用於訪問Karaf和Fuse命令的CLI。

install –s mvn:group.id /artifact.id/version 
e.g. install –s mvn:com.tutorialpoint.app/camel-firt-app/1.0-SNAPSHOT

JBoss Fuse - Apache CXF

在本章中,讓我們討論什麼是Apache CXF以及它如何在開發SOAP和Rest Web服務中提供幫助。

什麼是Apache CXF?

Apache CXF是一個Web服務開發框架,可用於開發SOAP和Rest Web服務。CXF完全符合JAX-RS和JAX-Ws標準。

它現在是最廣泛使用的Web服務開發框架。CXF已經學習並改進了Axis2,Axis2現在正逐漸被CXF取代。

CXF與Axis2

CXF Axis2
改進

CXF是目前最常用的框架。

它對Axis2有很多改進

Axis2正逐漸被CXF取代。

與CXF相比,它需要更多程式碼

所需程式碼

與Axis2相比,CXF需要的程式碼更少

Axis2相比之下需要更多程式碼

標準符合性

CSF 完全相容 JAX-RS 和 JAX-WS

Axis2 不完全相容 JAX-RS 和 JAX-WS

相容 Spring

前端分離

前端與 JAX-WS 程式碼乾淨分離

未提供乾淨的分離

SOAP

SOAP 代表簡單物件訪問協議 (Simple Object Access Protocol)。它是一種用於在兩個系統之間透過 Web 服務交換結構化資訊的協議。它主要依賴於 XML 來構建資料,並使用 HTTP 或 SMTP 進行訊息協商和傳輸。

有兩種開發 SOAP Web 服務的方法:

  • 程式碼優先 (Code first) − 在這種方法中,WSDL 從程式碼生成。

  • 契約優先 (Contract first) − 在契約優先方法中,程式碼從 WSDL 生成。

使用 CXF 開發 SOAP

配置 Maven

將以下配置檔案新增到 Maven 的 settings.xml 檔案中。

<profiles>
   <profile>
      <id>Jboss-Fuse</id>
		
      <activation>
         <activeByDefault>true</activeByDefault>
      </activation>
		
      <repositories>
         <repository>
            <id>fusesource</id>
            <url>http://repo.fusesource.com/nexus/content/groups/public/</url>
            <snapshots>
               <enabled>false</enabled>
            </snapshots>
            <releases>
               <enabled>true</enabled>
            </releases>
         </repository>
      </repositories>
		
   </profile>
</profiles>

建立骨架

mvn archetype:generate
-DarchetypeGroupId = org.apache.servicemix.tooling 
-DarchetypeArtifactId = servicemix-cxf-code-first-osgi-bundle 
-DarchetypeVersion=2012.01.0.redhat-60024 
-DgroupId = org.fusesource.example 
-DartifactId = cxf-basic 
-Dversion = 1.0-SNAPSHOT

構建 Web 服務專案.

mvn clean install

使用以下命令將 Web 服務安裝到 Fuse 中.

JBossFuse:karaf@root>install -s mvn:org.fusesource.example/cxf-basic/1.0-SNAPSH

檢查 bundle 是否已註冊 SOQP Web 服務

開啟 URL https://:8181/cxf

SOQP web-service

Web 服務應按如下方式列出。

測試 Web 服務

mvn -Pclient

資訊 − 從 com.to 類建立服務 {http://ws.totorials.com/} PersonService

torials.ws.Person
Invoking getPerson...
getPerson._getPerson_personId = Guillaume
getPerson._getPerson_ssn = 000-000-0000
getPerson._getPerson_name = Guillaume
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 30.668 s
[INFO] Finished at: 2016-02-15T21:01:20+05:30
[INFO] Final Memory: 10M/37M
[INFO] ------------------------------------------------------------------------

JBoss Fuse - REST Web 服務

首先,REST 代表具象狀態傳輸 (Representational State Transfer)。它是一種基於無狀態、可快取的客戶端-伺服器協議(大多數情況下為 HTTP)開發 Web 服務的方法。

REST Web 服務使用 HTTP 請求來發布、獲取和刪除網路資料。

使用 CXF 開發 REST

建立一個簡單的 Maven 快速啟動專案

mvn archetype:generate 
-DgroupId = com.tuts.abhinav 
-DartifactId = rest-service
-DarchetypeArtifactId = maven-archetype-quickstart 
-DinteractiveMode = false

新增依賴項

<dependency>
   <groupId>org.apache.servicemix.specs</groupId>
   <artifactId>org.apache.servicemix.specs.jsr311-api-1.1.1</artifactId>
   <version>1.9.0</version>
   <scope>provided</scope>
</dependency>

<dependency>
   <groupId>org.apache.servicemix</groupId>
   <artifactId>servicemix-http</artifactId>
   <version>2013.01</version>
</dependency>

<dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.16</version>
</dependency>

新增構建指令

<build>
   <defaultGoal>install</defaultGoal>
   <plugins>
      <plugin>
         <groupId>org.apache.felix</groupId>
         <artifalctId>maven-bundle-plugin</artifactId>
         <version>2.3.4</version>
         <extensions>true</extensions>
			
         <configuration>
            <instructions>
               <Bundle-SymbolicName>rest-example-database-post-method
                  </Bundle-SymbolicName>
               <Import-Package>* </Import-Package>
            </instructions>
         </configuration>
			
      </plugin>
   </plugins>
</build>

新增 Fuse 外掛倉庫

<pluginRepositories>
   <pluginRepository>
      <id>fusesource.m2</id>
      <name>FuseSource Community Release Repository</name>
      <url>http://repo.fusesource.com/nexus/content/repositories/releases</url>
      <snapshots>
         <enabled>false</enabled>
      </snapshots>
		
      <releases>
         <enabled>true</enabled>
      </releases>
   </pluginRepository>
<pluginRepositories>

新增倉庫

<repositories>
   <repository>
      <id>fusesource.m2</id>
      <name>FuseSource Community Release Repository</name>
      <url>http://repo.fusesource.com/nexus/content/repositories/releases</url>
      <snapshots>
         <enabled>false</enabled>
      </snapshots>
		
      <releases>
         <enabled>true</enabled>
      </releases>
		
   </repository>
	
   <repository>
      <id>fusesource.ea</id>
      <name>FuseSource Community Early Access Release Repository</name>
      <url>http://repo.fusesource.com/nexus/content/groups/ea</url>
      <snapshots>
         <enabled>false</enabled>
      </snapshots>
      <releases>
         <enabled>true</enabled>
      </releases>
   </repository>
	
</repositories>

建立服務類

在 com/tuts/ 下建立類 UserService.java

package com.tuts;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/UserService_1")
public class UserService {
   @GET
   @Path("/get_data")
   @Produces(MediaType.APPLICATION_JSON)
	
   public String getUser() {
      String reponse = "This is standard response from REST";
      return reponse;
   }
}

建立 Blueprint.xml

在 /src/main/resources/OSGI-INF/blueprint 下建立 blueprint.xml 檔案

<?xml version = "1.0" encoding = "UTF-8"?>
<blueprint xmlns = "http://www.osgi.org/xmlns/blueprint/v1.0.0"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xmlns:jaxrs = "http://cxf.apache.org/blueprint/jaxrs"
   xsi:schemaLocation = "http://www.osgi.org/xmlns/blueprint/v1.0.0 
   http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
   http://cxf.apache.org/blueprint/jaxrs 
   http://cxf.apache.org/schemas/blueprint/jaxrs.xsd">
	
   <jaxrs:server id = "service" address = "/users">
      <jaxrs:serviceBeans>
         <ref component-id = "userService" />
      </jaxrs:serviceBeans>
   </jaxrs:server>
	
   <bean id = "userService" class = "com.tuts.UserService" />
</blueprint>

在 Fuse 中安裝 REST 服務

install -s mvn:com.tuts.abhinav/rest-service/1.0-SNAPSHOT

檢查 Bundle 是否已註冊 Web 服務

開啟 URL https://:8181/cxf

Registered Web-Service

測試 Web 服務

開啟 URL https://:8181/cxf/users12/UserService_1/get_data

Localhost CXF

JBoss Fuse - Apache AMQ

在本章中,我們將瞭解 ActiveMQ 以及它如何充當訊息代理,從而允許應用程式彼此通訊。

什麼是 AMQ?

ActiveMQ 是一個用 Java 編寫的開源訊息代理。它完全符合 JMS 1.1 標準。

JMS 是一種允許開發基於訊息的系統的規範。ActiveMQ 充當訊息代理,位於應用程式之間,允許它們以非同步和可靠的方式進行通訊。

AMQ

訊息型別

為了更好地理解,下面解釋了兩種訊息傳遞選項。

點對點

在這種型別的通訊中,代理僅將訊息傳送給一個消費者,而其他消費者將等待從代理接收訊息。沒有消費者會收到相同的訊息。

如果沒有消費者,代理將保留訊息,直到它獲得一個消費者。這種型別的通訊也稱為基於佇列的通訊,其中生產者將訊息傳送到佇列,並且只有一個消費者從佇列中獲取一條訊息。如果有多個消費者,他們可能會收到下一條訊息,但他們不會收到與其他消費者相同的訊息。

Point to Point Messaging

釋出/訂閱

在這種型別的通訊中,代理將相同的訊息副本傳送給所有活動消費者。這種型別的通訊也稱為基於主題的通訊,其中代理將相同的訊息傳送給已訂閱特定主題的所有活動消費者。此模型支援單向通訊,不需要對傳輸的訊息進行驗證。

Publish/Subscribe Messaging

建立佇列和主題

Fuse 自帶 ActiveMQ。我們可以使用 FMC 控制檯(基於瀏覽器的 AMQ 工作介面)訪問 ActiveMQ。

使用localhost:8181登入 FMC 並選擇ActiveMQ選項卡。

ActiveMQ
  • 點選 +建立
  • 輸入佇列/主題名稱
  • 從單選按鈕中選擇佇列/主題
  • 點選建立佇列/建立主題
Queue/Create topic

現在您應該能夠在 root → Queue → 下看到已建立的TestQ

TestQ

要檢查已建立的主題,請按照 root → Topic 操作。

瀏覽/刪除佇列的內容

  • 使用localhost:8181登入 FMC

  • 選擇 ActiveMQ 選項卡

  • Root → Queue → TestQ