天天看點

WSO2 ——(7)ESB功能:協定轉換1 系統內建方式的演變2 協定轉換3 http與jms轉換示例

這篇文章介紹如何通過WSO2 ESB實作協定轉換的功能:通過 WSO2 ESB 實作SOAP/HTTP和JMS之間的協定轉換,實作用戶端與 ESB 之間 request/response 的互動方式。

1 系統內建方式的演變

如果你隻有兩個系統,不用折騰ESB了。

如果你有多個系統,而且這些系統還是異構的,比如有些是Java開發的、有些是.net開發的、有些還是C/S的比如是tuxedo、還有些是成熟産品如SAP等 。如何內建?

(1)Spaghetti Integration

WSO2 ——(7)ESB功能:協定轉換1 系統內建方式的演變2 協定轉換3 http與jms轉換示例

傳統的解決方式:意大利面條式內建。

由于曆史的原因,每個部門都建立了自己的系統。随着新的業務需求的顯現,其結果就是一堆各自為營的、條塊分割的系統。然後,當系統間需要共享資料時,就加入新的點對點的接口來解決系統內建的需要。随着人們使用系統,他們發現自己需要另一個系統的資料,結果又是一個點對點的內建。最終形成了意大利面式的內建。

這種內建方式可維護性、可擴充性、 故障檢測和系統管理都存在問題,為避免意大利面式內建造成的問題,ESB出現了。

(2)ESB內建

WSO2 ——(7)ESB功能:協定轉換1 系統內建方式的演變2 協定轉換3 http與jms轉換示例
WSO2 ——(7)ESB功能:協定轉換1 系統內建方式的演變2 協定轉換3 http與jms轉換示例

2 協定轉換

不同系統使用不同協定,比如現在的tuxedo中間件他向外暴露的有服務,他的服務是一種特殊格式的協定、A系統使用的EJP、B系統使用的webservice、C系統使用的servlet、D系統使用的email、E系統使用的RMI等等,ESB是如何實作不同協定間的轉換的呢?

WSO2 ESB 支援所有廣泛使用的傳輸協定,如HTTP, HTTPS, POP, IMAP, SMTP, JMS, AMQP, FIX, TCP, UDP, FTP, FTPS, SFTP, CIFS, MLLP, SMS. Transport負責傳輸指定格式的消息。一個新的傳輸協定使用Axis2傳輸架構可以輕松地被添加和插入到ESB中。

Transport包含兩個元件:

(1)Message builders:根據内容類型識别消息并轉化為XML格式。每一種内容類型都有相應的Message builders。WSO2 ESB包含基于文本的Message builders和基于二進制的Message builders(A->XML、B->XML……)。

(2)Message formatters:與Message builders相反。把XML格式的消息轉化為傳到Transport前消息的格式(XML->A、XML->B……)。

可以使用axis2架構實作新的Message builders、Message formatters。

參閱協定轉換(Working with Transports)

所有的transport都是基于Apache Axis2 transport架構。這個架構提供兩個接口,每一個transport必須實作這兩個接口,一個receiver,一個sender。配置管理Transport listeners和senders是互相獨立的,比如你可以使JMS transport sender可用,而JMS Transport listener不可用。

Wso2 carbon 和所有基于carbon的産品有一個全局配置檔案axis2.xml,在目錄<PRODUCT_HOME>/repository/conf/axis2下,axis2.xml檔案僅在伺服器啟動時被加載到記憶體,是以檔案的任何改變隻有重新開機伺服器才生效。其中<transportReceiver>和<transportSender>部分是配置transport的,HTTP、HTTPS transport預設已經配置。下面以http與jms協定的轉換來介紹ESB協定的配置及使用。

3 http與jms轉換示例

3.1 準備

3.1.1 配置使用JMS協定

所有協定的配置都在esb/repository/conf/axis2/axis2.xml檔案中。

若使用activemq,JMS協定配置如下:

[html]  view plain  copy

  1. <transportReceiver name="jms" class="org.apache.axis2.transport.jms.JMSListener">  
  2.         <parameter name="myTopicConnectionFactory" locked="false">  
  3.          <parameter name="java.naming.factory.initial" locked="false">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter>  
  4.          <parameter name="java.naming.provider.url" locked="false">tcp://localhost:61616</parameter>  
  5.          <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">TopicConnectionFactory</parameter>  
  6. <parameter name="transport.jms.ConnectionFactoryType" locked="false">topic</parameter>  
  7.         </parameter>  
  8.         <parameter name="myQueueConnectionFactory" locked="false">  
  9.          <parameter name="java.naming.factory.initial" locked="false">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter>  
  10.          <parameter name="java.naming.provider.url" locked="false">tcp://localhost:61616</parameter>  
  11.          <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>  
  12.     <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>  
  13.         </parameter>  
  14.         <parameter name="default" locked="false">  
  15.          <parameter name="java.naming.factory.initial" locked="false">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter>  
  16.          <parameter name="java.naming.provider.url" locked="false">tcp://localhost:61616</parameter>  
  17.          <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>  
  18.     <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>  
  19.         </parameter>  
  20. </transportReceiver>  
  21.  <transportSender name="jms" class="org.apache.axis2.transport.jms.JMSSender"/>  

3.1.2 啟動activemq 

http://activemq.apache.org/下載下傳,解壓,運作bin/activemq.bat

3.1.3 啟動WSO2 ESB

activemq 5.7.0 拷貝下列3個jar包到esb/repository/components/dropins,其他版本activemq還需要其他包,如activemqmq 5.9.1還需要activemq-client-5.9.1.jar、hawtbuf-1.9.jar

l activemq_core_5.7.0_1.0.0.jar

l eronimo_j2ee_management_1.1_spec_1.0.1_1.0.0.jar

l geronimo_jms_1.1_spec_1.1.1_1.0.0.jar

運作bin/wso2server.bat

3.2 開發

3.2.1 建立背景axis2服務

具體開發部署方法參見http://blog.csdn.net/szh1124/article/details/42125065,代碼參見NotaryService.java

注意,這個服務通過JMS協定通信,  /src/main/resources/META-INF/services.xml需要配置.

<transports>

   <transport>jms</transport>

</transports>

開發完成部署到WSO2 Application Server,當然,也可以将wso2 Application Server部署AAR服務的功能添加到WSO2 ESB,因為WSO2是OSGI的,功能可以輕松的添加和解除安裝。具體添加方法參見“WSO2 ESB添加功能元件”。

3.2.2 建立服務端點

詳細配置見NotaryEndpoint.xml,URL如下:

jms:/JMSNotaryService?transport.jms.DestinationType=queue&transport.jms.ContentTypeProperty=Content-Type&java.naming.provider.url=tcp://localhost:61616&java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&transport.jms.ConnectionFactoryType=queue&transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory

3.2.3 建立代理服務

WSO2 ——(7)ESB功能:協定轉換1 系統內建方式的演變2 協定轉換3 http與jms轉換示例

用戶端發送http請求到通過ESB的代理服務,ESB轉發請求消息到背景jms服務NotaryService,ESB從NotaryService接收響應并通過http協定傳回給用戶端。

詳細配置見NotaryProxy.xml

3.3 測試

點選NotaryProxy後面的“嘗試調用本服務”,輸入“李四”,如下圖所示:

WSO2 ——(7)ESB功能:協定轉換1 系統內建方式的演變2 協定轉換3 http與jms轉換示例

通過monitor/soap tracer可以看到NotaryProxy代理服務調用了背景JMSNotaryService。

WSO2 ——(7)ESB功能:協定轉換1 系統內建方式的演變2 協定轉換3 http與jms轉換示例

 示例相關配置下載下傳http://download.csdn.net/detail/szh1124/8295673