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