Flowable入门系列文章48 - Http任务

Posted 分享牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flowable入门系列文章48 - Http任务相关的知识,希望对你有一定的参考价值。

Http任务允许您发出HTTP请求,增强Flowable的集成功能。请注意,Http任务不是 BPMN 2.0规范的正式任务(因此没有专门的图标)。因此,在Flowable中,Http任务是作为一个专门的服务任务来实现的。

1、Http客户端配置

Flowable引擎通过可配置的Http客户端发出Http请求。以下属性可以在flowable.cfg.xml配置文件中设置:

<bean id="processEngineConfiguration"
class="org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!-- http client configurations -->
<property name="httpClientConfig" ref="httpClientConfig"/>
</bean>
<bean id="httpClientConfig" class="org.flowable.engine.cfg.HttpClientConfig">
<property name="connectTimeout" value="5000"/>
<property name="socketTimeout" value="5000"/>
<property name="connectionRequestTimeout" value="5000"/>
<property name="requestRetryLimit" value="5"/>
</bean>
属性需要描述
connectTimeout没有连接超时(以毫秒为单位)。默认设置为5000。
socketTimeout没有套接字超时(以毫秒为单位)。默认设置为5000。
connectionRequestTimeout没有连接请求超时(以毫秒为单位)。默认设置为5000。
requestRetryLimit没有请求重试限制(0表示不重试)。默认设置为3。
disableCertVerify没有标记以禁用SSL证书验证。默认情况下设置为false。

2、定义Http任务

Http任务是作为一个专门的服务任务来实现的,通过设置服务任务的类型’http’来定义。

 <serviceTask id="httpGet" flowable:type="http">

也可以通过提供自定义实现来覆盖默认的Http Task行为。自定义实现应该扩展org.flowable.http.HttpActivityBehavior并覆盖perform()方法。应该在任务定义中设置字段httpActivityBehaviorClass。这个字段的默认值是org.flowable.http.impl.HttpActivityBehaviorImpl。目前HttpActivityBehaviorImpl基于Apache Http Client。由于Apache Http客户端可以通过多种方式进行定制,因此所有可能的选项都不在HttpClient配置中使用。要创建自定义客户端。

<serviceTask id =“httpGet”flowable:type =“http”>
<extensionElements>
<flowable:field name =“httpActivityBehaviorClass”>
<流动性:字符串>
<![CDATA [org.example.flowable.HttpActivityBehaviorCustomImpl]]>
</可流动:字符串>
</可流动:字段>
</ extensionElements>
</ sericeTask>

3、Http任务配置

Http任务是通过字段注入来配置的。这些属性的所有值都可以包含EL表达式,这些表达式在流程执行期间在运行时被解析。以下属性可以设置:

属性需要描述
requestMethod请求方法(GET,POST,PUT,DELETE)。
requestUrl请求URL(例子 - http://flowable.org)。
requestHeaders没有行分隔Http请求标头。示例 -Content-Type:application / json 授权:基本aGFRlc3Q =
requestBody没有请求正文示例 - $ {sampleBody}
请求超时没有请求超时(以毫秒为单位)(示例 - 5000)。默认值是0,表示没有超时。
disallowRedirects没有标记为禁止Http重定向。默认是false。(例如 - 真)。
failStatusCodes没有以逗号分隔Http响应状态码列表,以使请求失败,并将错误引发为FlowableException。示例:400,404,500,503示例:400,5XX
handleStatusCodes没有逗号分隔的任务将抛出BpmnError的状态码列表。BpmnError的错误代码是HTTP。例如,404状态代码设置为错误代码HTTP404。只有在disallowRedirects字段也被设置的情况下才会抛出3XX状态码。handleStatusCodes中的状态代码在failStatusCodes中设置时,将覆盖failStatusCodes中的状态代码。例如:400,404,500,503例如:3XX,4XX,5XX
ignoreException没有用于忽略异常的标志,捕获并将异常消息保存为 .errorMessage。
saveRequestVariables没有标记保存请求变量。默认情况下,只有响应相关的变量被保存在执行中。
saveResponseParameters没有标记保存所有响应变量,包括HTTP状态,标题等。默认情况下,只有响应主体被保存在执行中。
resultVariablePrefix没有执行变量名称的前缀。如果未设置前缀,变量将以名称保存为。fieldName。例如,对于id 为task7的任务,requestUrl被保存为task7.requestUrl。
httpActivityBehaviorClass没有org.flowable.http.HttpActivityBehavior的自定义扩展的完整类名。

除了提供的字段之外,还将根据saveResponseParameters标志将以下内容设置为成功执行时的变量。

变量可选的描述
responseProtocolHttp版本
responseReasonHttp响应原因短语。
responseStatusCodeHTTP响应状态码(例子 - 200)。
responseHeaders响应行分隔Http响应头。示例 -Content-Type:pplication / jsonContent-Length:777
responseBody响应正文作为字符串,如果有的话。
错误信息忽略错误消息,如果有的话。

4、结果变量

记住所有上面的执行变量名都以resultVariablePrefix的计算值作为前缀。例如响应状态码可以在另一个活动中被访问,如task7.responseStatusCode。这里task7是服务任务的id。要覆盖此行为,请根据需要设置resultVariablePrefix。

5、用法示例

以下XML片段显示了使用Http任务的示例。

<serviceTask id="httpGet" flowable:type="http">
<extensionElements>
<flowable:field name="requestMethod" stringValue="GET" />
<flowable:field name="requestUrl" stringValue="http://flowable.org" />
<flowable:field name="requestHeaders">
<flowable:expression>
<![CDATA[
Accept: text/html
Cache-Control: no-cache
]]>
</flowable:expression>
</flowable:field>
<flowable:field name="requestTimeout">
<flowable:expression>
<![CDATA[
${requestTimeout}
]]>
</flowable:expression>
</flowable:field>
<flowable:field name="resultVariablePrefix">
<flowable:string>task7</flowable:string>
</flowable:field>
</extensionElements>
</serviceTask>

6、错误处理

默认情况下,Http Task在Connection,IO或任何未处理的异常发生时抛出FlowableException。但默认情况下,它不处理任何重定向/客户端/服务器错误http状态码。我们可以通过设置failStatusCodes和/或handleStatusCodes字段来配置任务来处理异常和http状态。由handleStatusCodes引发的BpmnError应该像正常的BPMN异常一样处理,具有相应的边界错误处理程序。下面是一些异常处理和http任务重试的例子。

在400和5XX异步http任务上失败,并使用failedJobRetryTimeCycle重试

<serviceTask id="failGet" name="Fail test" flowable:async="true" flowable:type="http">
<extensionElements>
<flowable:field name="requestMethod">
<flowable:string><![CDATA[GET]]></flowable:string>
</flowable:field>
<flowable:field name="requestUrl">
<flowable:string><![CDATA[http://localhost:9798/api/fail]]></flowable:string>
</flowable:field>
<flowable:field name="failStatusCodes">
<flowable:string><![CDATA[400, 5XX]]></flowable:string>
</flowable:field>
<flowable:failedJobRetryTimeCycle>R3/PT5S</flowable:failedJobRetryTimeCycle>
</extensionElements>
</serviceTask>

处理400作为BmpnError

<serviceTask id="handleGet" name="HTTP Task" flowable:type="http">
<extensionElements>
<flowable:field name="requestMethod">
<flowable:string><![CDATA[GET]]></flowable:string>
</flowable:field>
<flowable:field name="requestUrl">
<flowable:string><![CDATA[http://localhost:9798/api/fail]]></flowable:string>
</flowable:field>
<flowable:field name="handleStatusCodes">
<flowable:string><![CDATA[4XX]]></flowable:string>
</flowable:field>
</extensionElements>
</serviceTask>
<boundaryEvent id="catch400" attachedToRef="handleGet">
<errorEventDefinition errorRef="HTTP400"></errorEventDefinition>
</boundaryEvent>

忽略例外。

<serviceTask id="ignoreTask" name="Fail test" flowable:type="http">
<extensionElements>
<flowable:field name="requestMethod">
<flowable:string><![CDATA[GET]]></flowable:string>
</flowable:field>
<flowable:field name="requestUrl">
<flowable:string><![CDATA[http://nohost:9798/api]]></flowable:string>
</flowable:field>
<flowable:field name="ignoreException">
<flowable:string><![CDATA[true]]></flowable:string>
</flowable:field>
</extensionElements>
</serviceTask>

上面文章来自盘古BPM研究院:http://vue.pangubpm.com/
文章翻译提交:https://github.com/qiudaoke/flowable-userguide
了解更多文章可以关注微信公众号:

以上是关于Flowable入门系列文章48 - Http任务的主要内容,如果未能解决你的问题,请参考以下文章

Flowable入门系列文章22 - 基本的Flowable概念三

Flowable入门系列文章53 - 壳任务

Flowable入门系列文章49 - 骡子任务

Flowable入门系列文章50 - 骆驼任务

Flowable入门系列文章47 - 电子邮件任务

Flowable入门系列文章43 - 脚本任务