最近在使用流程引擎时,面对了这样的需求,当系统发送流程节点监听的消息时,需要根据监听到的消息类型来决定调用哪个服务,并且处理调用服务的出差入参。
设计如下:
流程在执行过程中,可以携带对应的参数,首先,流程需要携带配置好的服务名称和方法名称,我依此来获取对应的服务在数据库的配置
方法配置设计包括:
id bigint
method_name varchar 业务方法描述名称
service_code varchar 服务code
match_param varchar 映射关系
input_params text 请求参数(需要的参数json)
output_params text 输出需要的结果
call_url varchar 调用地址
call_method varchar 方法名
aware_type varchar 消息类型
create_time datetime 创建时间
update_time datetime 更新时间
具体流程如下:
1.根据服务名和方法名查询到对应的如上配置
2.入参中将需要替换的变量用${"变量名"}来代替,此变量名为该参数在流程引擎设计中的变量名,另外,在match_param中存下该变量的变量名和变量类型
3.通过match_param中的变量名来从流程本身携带的上下文中获取到对应的变量值,然后通过操作json字符串来替换input_params所需要的值,封装入参。
示例:
input_params:
{
"query":{
"msg":"${searchMsg}",
"id":"07b8d9504ed44976a6a85eefe0389463",
"type":"text"
}
}
match_param:
[
{
"match":"searchMsg",
"type":"0"
}
]
4.系统中注入RestTemplate来作为发送请求的工具,根据地址和请求方式以及入参来调用对应的服务。
注:由于调用服务是系统外不确定因素,返回的时间无法确认,方法设计通过线程池来启动线程调用服务
5.获取出参,出参设计存所需字段的类型和所需字段在出参中的层级以及在流程引擎中的变量字段名称
示例:
output_params:
[
{
"data.messages":"searchResultContent",
"type":"1"
}
]
6.将获取到的参数以json格式储存,并且将此次会话的sessionId和感知类型aware_type发送到kafka中,由kafka来处理消费,保存到redis中并且发送给前端来展示服务调用的结果。