簡體   English   中英

從一種消息格式轉換為另一種格式

[英]Convert from 1 message format to another format

這是我的要求。

我有一個客戶端正在使用某種網絡協議將特定消息格式發送給某些軟件服務提供商(ABC)。

現在,此客戶端正在切換軟件服務提供商(XYZ),但不想更改其軟件,並希望繼續發送與ABC提供程序相同的消息。

  • 提供商ABC通過某種古老的網絡協議使用某種基於位置的消息格式
  • 提供者XYZ使用基於HTTP(s)Web服務的XML,而不是SOA,而只是具有XML的簡單POST
  • 一些值可以直接映射,而另一些則必須重新計算或修改。 例如,將客戶的帳號從ABC提供商轉換為XYZ提供商的帳號。 這是請求和響應。
  • 古老的網絡協議將在網絡級別轉換為TCPI / IP,因此這不是問題。
  • 客戶期望實時響應。 即:客戶提出要求,XYZ做任何事情,然后回饋給客戶。

因此,我需要創建一種接受TCP / IP的隧道,將消息轉換為XML,將HTTP(s)POST發送至XYZ,獲取XML響應,轉換回基於位置的位置,通過TCPI / IP回復給客戶端。

這是ESB類型的事情,我是否應該編寫某種可以實現此目的的JAVA服務器應用程序?

<flow name="FileTransferFlow1" doc:name="FileTransferFlow1">
    <file:inbound-endpoint path="C:\mule_projects\filetransfer\in" responseTimeout="10000" doc:name="IncomingFile"/>
    <http:outbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" doc:name="HTTP" responseTransformer-refs="Java"/>
     <custom-transformer class="com.Transformer" doc:name="Java"/>
    <file:outbound-endpoint path="C:\mule_projects\filetransfer\out" responseTimeout="10000" doc:name="OutgoingFile"/>
</flow>

您有太多選擇。 從Python開始,Perl ..有一些庫/模塊提供您的TCP / HTTP / telnet / ...支持。 使用它,您可以做到這一點。

ESB可能對此有些大材小用,它是進行大型集成的大型框架,但是是的,您可以編寫您的BC(綁定組件)並做到這一點。 性能我不確定ESB是否會像.pl / .py這樣的更原始的東西一樣好

簡而言之,有太多選擇。 您必須根據部署環境來接聽電話。

例如,您說“某些值可以直接映射,而其他值則必須重新計算或修改。例如,將客戶的帳號從ABC Provider轉換為XYZ提供者的帳號。這是用於請求和響應。” ,如果ABC-A / c-num到XYZ-A / c-num的映射僅通過遠程EJB調用才可用,那么您可能要考慮使用J2EE編寫整個內容。 如果您“計算”需要一些特定的庫,那么您也必須將其考慮在內...

希望這不會使您的問題變得更糟.. :)

PS:您應該開始接受先前問題的答案。 如霍姆所說。

如果需要使用ESB,則可以嘗試WSO2 ESB [1],可以直接使用各種示例[2]。 WSO2 ESB支持各種類型的消息轉換,協議交換等等。

[1] http://wso2.org/library/esb [2] http://wso2.org/project/esb/java/4.0.0/docs/samples_index.html

嘗試過Mule ESB,重量非常輕。 我還要說更多的競爭。 我喜歡它與SOA或肥皂沒有特別的聯系。 因此,您可以構建任何類型的端點,從簡單的TCP / IP,HTTP,文件到電子郵件,再到實際上具有十二個以上連接器的任何對象,您甚至可以編寫自己的端點。 我也喜歡這樣的事實,即消息可以是任何東西。 我可能是錯的,但是即使當其他人聲稱它們具有各種連接器和消息格式時,他們似乎也將SOAP藏在幕后某個地方,這似乎有些棘手,其他一些人看起來不錯,但是文檔卻很差。 不喜歡某些基本的JDBC功能僅在企業版中可用的事實。 即:要從存儲的proc調用中獲取輸出參數,您需要企業版。

實際上,我可以選擇任何允許我創建服務器以接收HTTP的服務器API,然后編寫代碼以轉換消息,打開與下一個服務的客戶端連接,將其發送出去,接收響應,然后將其重新轉換回去。然后返回給客戶。 同時確保線程和隊列在服務器中正確運行。 也許我可以只使用jetty和servlet並在一個請求中完成所有操作。 這是一個選項,但是如果我必須切換到TCP / IP,則只需稍微更改配置即可。 等着看客戶怎么說。

ESB基本上是膠水和管道。 我要做的就是編寫三個自定義的轉換器類,因為我處理的消息是專有的銀行格式,並且不完全映射到簡單的XSLT / XML轉換...還有大約20個XML標記將它們放在一起...

這是我擺脫Mule所需要的一切(不包括構建數據源和SQL查詢的標簽)...

<flow name="myFlow">
    <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" />
    <object-to-string-transformer />
    <custom-transformer class="com.mycom.transformer.MyTransformer" />
    <enricher target="#[variable:client]">
        <jdbc:outbound-endpoint queryKey="getClientConfig" exchange-pattern="request-response" />
    </enricher>
    <custom-transformer class="com.MyCom.transformer.MyOtherTransformer" />
    <http:outbound-endpoint exchange-pattern="request-response" host="xxx.xxx.xxx.xxx" port="80" path="some path" method="POST"/>
    <custom-transformer class="com.MyCom.transformer.BackToOtherFormat" />
</flow>

所以基本上... 1-接收帶有自定義消息的HTTP 2-解析消息以獲取客戶端編號3-在數據庫中查找客戶端編號以獲取其他服務的客戶端編號... 4-創建新消息5-發送關閉其他服務6-將響應轉換回7-返回客戶端

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM