"Transport",是WSO2 ESB中一種很有用的功能,不同的transport類型,用來接收、傳送各種的訊息(message)。

目前,WSO2 ESB底層中的WSO2 Carbon,支援底下種類的transport:
    HTTP       HTTPS 
  HTTP-NIO   HTTPS-NIO
  Mail   JMS
  VFS   TCP
  Local   UDP
  FIX    

利用這些transport,搭配各種Transfrom mediators,就能將不同協定、標準、格式的應用程式,所傳來的各種訊息進行轉換、轉傳,達到ESB的功能。


範例參考網址:http://wso2.org/library/tutorials/2011/01/sftp-file-transer-wso2-esb

這個範例演示了一個簡單的動作,利用VSFTP,將一個XML檔從一個目錄取回ESB,再由ESB寫到另一個目錄。 


版本及平台:
1、版本及平台,同“將WSO2 ESB 4.0.2佈署到JBoss 5.1GA"中的“範例環境及代號說明”
2、SFTP登入帳號/密碼:ftpuser / wso2
3、in, out, original目錄所在位置:/home/ftpuser/vsftp/ 

遭遇問題及注意事項:
1、 雖然在Apache Commons上,
  http://commons.apache.org/vfs/filesystems.html
  有寫道SFTP的VFS語法為
  sftp://[ username[: password]@] hostname[: port][ absolute-path]

  不過, 真正在測試時,似乎是“相對路徑”,而非“絕對路徑”。
  所以,後來將範例內容改為:

<proxy xmlns="http://ws.apache.org/ns/synapse" name="SFTPVFSProxy" transports="vfs" statistics="disable" trace="enable" startOnLoad="true">
<target>
<inSequence>
<log level="full" />
<property name="File" expression="fn:concat('test-', get-property('transport', 'FILE_PATH'))" scope="default" />
<property name="transport.vfs.ReplyFileName" expression="fn:concat(fn:substring-after(get-property('MessageID'), 'urn:uuid:'), '.xml')" scope="transport" />
<property name="OUT_ONLY" value="true" />
<send>
<endpoint>
<address uri="vfs:sftp://ftpuser:wso2@192.168.10.1/vsftp/out" />
</endpoint>
</send>
</inSequence>
</target>
<parameter name="transport.PollInterval">15</parameter>
<parameter name="transport.vfs.FileURI">vfs:sftp://ftpuser:wso2@192.168.10.1/vsftp/in</parameter>
<parameter name="transport.vfs.MoveAfterProcess">vfs:sftp://ftpuser:wso2@192.168.10.1/vsftp/out</parameter>
<parameter name="transport.vfs.ActionAfterProces">MOVE</parameter>
<parameter name="transport.vfs.MoveAfterFailure">vfs:sftp://ftpuser:wso2@192.168.10.1/vsftp/original</parameter>
<parameter name="transport.vfs.FileNamePattern">.*.xml</parameter>
<parameter name="transport.vfs.ContentType">application/xml</parameter>
<parameter name="transport.vfs.ActionAfterFailure">MOVE</parameter>
<parameter name="serviceType">proxy</parameter>
</proxy> 

  可以注意到,在sftp的hostname後面,並非
  /home/ftpuser/vsftp/in
  /home/ftpuser/vsftp/out
  /home/ftpuser/vsftp/original
  而是,
  /vsftp/in
  /vsftp/out
  /vsftp/original

  另外,FileURI只給目錄位置,而沒有連同檔名一併標入,即
  <parameter
  name="transport.vfs.FileURI">
vfs:sftp://ftpuser:wso2@192.168.10.1/vsftp/in
  </parameter>

  而非
  <parameter
  name="transport.vfs.FileURI">
vfs:sftp://ftpuser:wso2@192.168.10.1/vsftp/in/test.xml
  </parameter>
  否則,ESB會將/vsftp/in/test.xml檔成一個目錄,如下錯誤:
  vsftp_path_e.png 


 

2、有可能SFTP服務沒有安裝,要取得vsftpd-xxx.rpm進行安裝。

3、在Server上的vsftpd服務,在/etc/vsftpd/vsftpd.conf中,要啟用寫入功能,所以要設定
  write_enable=YES

補充說明:
文章中也有提到。VFS transport的SFTP,為了確保不會同時有多個transport listener處理檔案。因此,處理前,為要進行處理的檔案建立一個.lock檔,
vfsftp_lock.png
等處理結束時,再將該.lock檔刪除掉。

arrow
arrow
    全站熱搜

    來自大海的心 發表在 痞客邦 留言(0) 人氣()