之前一直在使用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