1.概要
在JPAAS中,我们可以在事件配置时,调用WEB请求。Web调用请求代码 在 com.redxun.bpm.activiti.eventhandler.impl.WebReqEventHandler类中。具体的代码逻辑如下:
1.在调用时获取,上下文的流程数据,表单数据等。
2.将在web请求配置的配置获取到。
3.将这些数据使用Feign发送到jpaas-system调用web 请求接口。
4.响应回来后,我们可以在执行web请求配置的脚本执行脚本。
2.相关代码
2.1 Web请求处理器
public class WebReqEventHandler implements IEventHandler {
@Resource
GroovyEngine groovyEngine;
@Resource
SystemClient systemClient;
@Override
public EventHanderType getType() {
return new EventHanderType("webreq","WEB调用请求");
}
@Override
public void handEvent(BaseEventMessage message) {
EventConfig eventSetting= message.getEventConfig();
JSONObject config=eventSetting.getConfig();
if(BeanUtil.isEmpty(config)) {
return;
}
String script=config.getString("script");
String alias = config.getJSONObject("webDef").getString("alias");
String headerData = config.getString("header");
String paramsData=config.getString("params");
Map<String,Object> params=new HashMap<>(SysConstant.INIT_CAPACITY_16);
Map<String,Object> bpmParam = message.getVars();
params.put("bpmParam",bpmParam);
params.put("actInstId",message.getActInstId());
IExecutionCmd cmd = ProcessHandleUtil.getProcessCmd();
Map<String, Object> map;
if(cmd!=null){
map = json2Map(cmd.getBoDataMap());
}else{
map = json2Map(message.getFormData());
}
if (BeanUtil.isNotEmpty(map)) {
Iterator<String> it = map.keySet().iterator();
Map<String, Object> tmpMap = new HashMap<>(map.size());
while (it.hasNext()) {
String formAlias = it.next();
String json = JSONObject.toJSONString(map.get(formAlias));
tmpMap.putAll(parseFormData(formAlias, json));
}
params.putAll(tmpMap);
params.put("formParam", tmpMap);
}
try {
JSONObject startParam = new JSONObject();
startParam.put("alias", alias);
startParam.put("header", headerData);
startParam.put("params", paramsData);
startParam.put("paramData", JSONObject.toJSONString(params));
JsonResult jr = systemClient.start(startParam);
if (StringUtils.isEmpty(script)) {
return;
}
params.put("result", jr.getData());
try {
groovyEngine.executeScripts(script, params);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("执行调用Web服务后的脚本:(" + script + ",参数:" + params.toString() + "),出错原因:" + e.getMessage());
}
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException("执行Web请求("+")调用出现异常:"+e.getMessage());
}
}
/**
* JSON转为Map
*
* @param jsonObject
* @return Map<String, Object>
* @throws
* @since 1.0.0
*/
private static Map<String, Object> json2Map(JSONObject jsonObject) {
Map<String, Object> dataMap = new HashMap<>(jsonObject.size());
Iterator<String> its = jsonObject.keySet().iterator();
while (its.hasNext()) {
String key = its.next();
Object val = jsonObject.get(key);
dataMap.put(key, val);
}
return dataMap;
}
/**
* 解析表单数据
*
* @param formAlias
* @param json
* @return
*/
private static Map<String, Object> parseFormData(String formAlias, String json) {
JSONObject jsonObject = JSONObject.parseObject(json);
Map<String, Object> dataMap = new HashMap<>(jsonObject.size());
Iterator<String> its = jsonObject.keySet().iterator();
while (its.hasNext()) {
String key = its.next();
Object val = jsonObject.get(key);
dataMap.put(formAlias + "_" + key, val);
}
return dataMap;
}
}
从上面的代码我们可以看到:
参数 | 说明 |
---|---|
alias | web请求别名 |
params | web请求的参数定义 |
paramData | 上下文数据的分装。这个在下面的表格说明 |
paramData 上下文参数:
参数 | 说明 |
---|---|
bpmParam | 流程变量,在使用时,举例说明: bpmParam.instId 获取流程实例ID |
actInstId | 流程引擎实例ID |
formParam | 表单参数变量,获取表单数据方法。举例说明 formParam.form别名_字段KEY. |
2.2 jpaas-system执行web请求实现
public JsonResult start(@RequestBody JSONObject jsonObject) throws Exception {
String alias = jsonObject.getString("alias");
String header = jsonObject.getString("header");
String params = jsonObject.getString("params");
String paramData = jsonObject.getString("paramData");
JSONObject json = JSONObject.parseObject(paramData);
return sysWebReqDefServiceImpl.executeStart(alias, header, params, json.getInnerMap());
}
public JsonResult executeStart(String alias, String header, String params, Map map) {
SysWebReqDef sysWebReqDef = getByAlias(alias);
if (BeanUtil.isEmpty(sysWebReqDef)) {
return new JsonResult<String>(false, "未设置服务");
}
Map<String, String> headerMap = new HashMap<>(SysConstant.INIT_CAPACITY_16);
if (StringUtils.isNotEmpty(header)) {
JSONArray ary = JSONArray.parseArray(header);
headerMap = new HashMap<>(ary.size());
Iterator<Object> it = ary.iterator();
while (it.hasNext()) {
JSONObject obj = (JSONObject) it.next();
//获取配置结果
Object value = getValue(map, obj);
headerMap.put(obj.getString("key"), (String) value);
}
}
Map<String, String> paramsMap = new HashMap<>(SysConstant.INIT_CAPACITY_16);
if (StringUtils.isNotEmpty(params)) {
JSONArray ary = JSONArray.parseArray(params);
paramsMap = new HashMap<>(ary.size());
Iterator<Object> it = ary.iterator();
while (it.hasNext()) {
JSONObject obj = (JSONObject) it.next();
//获取配置结果
Object value = getValue(map, obj);
paramsMap.put(obj.getString("key"), (String) value);
}
}
//请求URL
String url = sysWebReqDef.getUrl();
//报文模板
String template = sysWebReqDef.getTemp();
//调用类型(soap,restful)
String type = sysWebReqDef.getType();
if ("SOAP".equals(sysWebReqDef.getMode())) {
type = "POST";
}
JsonResult result = executeReq(url, type, headerMap, paramsMap, template);
return result;
}
/**
* 获取参数定义的值。
* params 为上节定义的上下文数据。
* jsonObject:为具体的参数定义,
*/
private Object getValue(Map<String, Object> params, JSONObject jsonObject) {
String valSource = (String) jsonObject.get("valueSource");
String valueDef = (String) jsonObject.get("valueDef");
Object val = null;
//表单数据
if (S_FORM_PARAM.equals(valSource)) {
Map<String, Object> map = (Map<String, Object>) params.get("formParam");
if (BeanUtil.isNotEmpty(map)) {
val = map.get(valueDef);
}
}
//流程变量数据
else if (S_BPM_PARAM.equals(valSource)) {
Map<String, Object> map = (Map<String, Object>) params.get("bpmParam");
val = map.get(valueDef);
}
// 固定值
else if (S_FIXED_VAR.equals(valSource)) {
val = valueDef;
}
// 脚本
else if (S_SCRIPT.equals(valSource)) {
val = (String) groovyEngine.executeScripts(valueDef, params);
}
//常量
else if (S_CONSTANT.equals(valSource)) {
val = constVarContext.getValByKey(valueDef, params);
}
//url参数
else {
val = jsonObject.get("value");
}
return val;
}
注意定义的参数为脚本时,我们可以看到上面的一段代码:
val = (String) groovyEngine.executeScripts(valueDef, params);
这个 params 就是上节提到的变量数据。比如需要获取 流程变量为 bpmParam.变量名
获取具体的变量。
文档更新时间: 2022-01-20 14:53 作者:zyg