利用HTTPCaller進行fme模版的同步和異步調用

 

之前一直在使用HTTPCaller轉換器,但是對其瞭解並不多,僅限制於一個用很簡單的GET方法。很多時候,好像只用這個功能也夠了。最近稍微瞭解一點關於網絡請求的東西,才發現原來用FME還可以許多比較炫酷的功能,所制約我們的,其實是自己的知識積累。

這裏,我就以HTTPCaller調用fmeintegration上的方案爲例,介紹一下這HTTPCaller的使用。

在製作模版之前,先要簡單的介紹一下FME Integration REST API的相關的接口。本次只涉及到三個接口調用,一個接口是向fmeintegration進行任務提交,第二個是由上一個請求返回的任務ID去找到此次調用在fmeserver上對應的JobID,第三個是通過fmeserver的JobID監測是否運行成功。

要使用fmeintegration,需要安裝配置fmeintegration,併發布對應的解決方案,這裏我就不再多說,本文主要是針對於HTTPCaller進行網絡請求進行講解。

首先我們看一下meintegration上進行任務提交的接口。

在輸入對應的fmeintegration授權碼,解決方案名稱,和包含方案運行參數的響應體後,會返回一個對應的url,響應體和響應代碼,以供測試是否調用正確。

進行網絡請求的響應體是由一個帶有傳參的JSON字符串組成,每個傳參的格式如下:

{

    "name": "string",

    "value": "string",

    "exploded": true,

    "separator": "string"

 }

多個傳參組合成一個更復雜的JSON數據格式,以本次測試的解決方案爲例,它的參數如下:

對應的JSON如下:

{"parameters":

               [{"name":"S_GDB","value":"","exploded":true,"separator":""},

               {"name":"FEATURETYPES","value":"","exploded":false,"separator":""},

               {"name":"TCAreaMin","value":"","exploded":false,"separator":""},

               {"name":"FANOUT_DIR","value":"","exploded":false,"separator":""}

]}

其中必須設置的三個值爲"name"爲傳參的名稱,"value"爲傳參的值,"exploded"爲是否分解任務的選項。

 

一、參數格式化,並進行任務提交

在對有一個大致的瞭解之後,我們可以開始進行調用了。

首先需要處理的是進行任務提交時候,需要傳遞的參數(即響應體的問題),以便我們能夠靈活地設置請求參數。

用AttributeCreator將所有的創建一個包含了所有傳參的JSON模版,模版格式如下:

{"parameters":

               [{"name":"S_GDB","value":"","exploded":true,"separator":""},

               {"name":"FEATURETYPES","value":"","exploded":false,"separator":""},

               {"name":"TCAreaMin","value":"","exploded":false,"separator":""},

               {"name":"FANOUT_DIR","value":"","exploded":false,"separator":""}

]}

這裏需要說一點的是,"S_GDB"的參數,我設置的"exploded"爲true,即當有多個參數以逗號“,”分割的參數傳遞進來是,會將其分解成多個任務運行。這樣一個請求體的JSON模版就做好了。

然後用JSONUpdater轉換器去更新傳參的"value"值,即可修改成我所需要的JSON數據。具體參數設置如下:

在本文中,我設置的是一個固定值,你也可以將其發佈成用戶參數,這樣就可以動態地設置模版參數進行調用。

通過HTTPCaller轉換器調用接口

設置請求服務爲“POST”,URL如下:

http://<yourServerHost>/fmeintegration/webservice/rest/task/run/<yourSchema>?token=<yourToken>

<yourServerHost>爲fmeintegration的地址,<yourSchema>爲被調用的方案名稱,<yourToken>爲fmeintegration的Token值。

Request heard設置請求報文,響應報文的格式爲json格式。即Content-Type爲application/json,Accept爲application/json。

請求體爲更新後的請求參數配置_result。

運行模版,查看fmeintegration任務欄,會發現我已經通過調用fmeintegration REST API,進行了一次任務提交。

這個時候基本上我們通過HTTPCaller對一個網絡服務進行異步調用的操作已經完成了。但如果說我們想要進行同步操作,等待這個任務執行完成之後,再執行另外一個任務?該怎麼處理呢?

 

二、任務執行結果監測

要想進行同步操作,可以通過訪問監測fme server的任務運行狀態來查看一個任務是否已經運行成功。但由於我們調用的是fmeintegration,所以先要找到改任務在fme server上的job_id。

還記得上面調用的響應報文嗎?其,傳遞的是一個狀態碼,加一個fmeintegration的任務ID。

通過解析獲得fmeintegration的任務ID,然後再去訪問任務管理下的另外一個接口,獲取任務下的服務調用列表。

 

http://<yourServerHost>/fmeintegration/webservice/rest/task/@Value(task_id)/jobs/all?token=<yourToken>

 

其中<yourServerHost>爲fmeintegration的地址,@Value(task_id)爲meintegration的任務ID,<yourToken>爲fmeintegration的Token值。

這裏需要注意一點的是,如果馬上進行網絡請求,可能fmeintegration還沒有對fme server進行服務調用,就運行到了這一步,從而導致訪問失敗。 因此,在訪問之前最好先加一個Decelerator轉換器,延時運行。

訪問後返回的數據是一個串非常長的json數據,但我們只需要其中一個fmeJobId的屬性,直接用JSONFlattener和ListExploder獲取到我們所需要的所有屬性即可。

 

在獲取到JobId之後,訪問如下URL:

http://<yourServerHost>/fmerest/v3/transformations/jobs/id/@Value(jobID)/result

<yourServerHost>和@Value(jobID)對應你的服務地址和jobID,

在返回的數據中有一個"status"屬性,只有當值爲"PULLED" 的時候,即代表還在執行。

接下來就需要每隔一段時間,就去監測一次該服務在fmeserver上的運行狀態。這就需要我們構建一個定時器。

創建一個名JobStatusTester的自定義轉換器:

Decelerator設置延時運行,然後HTTPCaller進行網絡請求,然後解析數據格式,當其"status"不爲"PULLED"的時候,則跳出循環,否則延時一段時間後重新進行網絡請求,直到"status"不爲"PULLED"爲止。

如此,一個進行同步調用的模版便完成了,到底有什麼用呢?

最直觀的一個作用便是可以通過一個模版把所有的解決方案都合併起來發布成一個服務, 每次運行的時候還可以手動地去選擇我需要運行那些解決方案,是同步還是異步,輕易地用一個模版完成了需要修改代碼完成的事情。

 

模板下載:

鏈接:https://pan.baidu.com/s/1O4-1e6ioKHL5u117GhDlew 
        提取碼:yk7p

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章