camunda 动态生成流程(代码生成xml)

camunda 动态生成流程(代码生成xml)

camunda 动态创建流程XML

根据caunda-model的能力,将xml代码化,将用户数据的结构转换成xml,进而发布到camuda里。
代码是提供参考,已经验证完成,并在生产环境使用。

        <dependency>
            <groupId>org.camunda.bpm.model</groupId>
            <artifactId>camunda-bpmn-model</artifactId>
            <version>7.20.0-alpha3</version>
        </dependency>

public class TestCamunda {

    public static String url = "http://localhost:8080/engine-rest/deployment/create";
    public static void main(String[] args) {
        autoGenerateBPMN();
    }


        // 子流程
        CamundaFlowCreateParam param = new CamundaFlowCreateParam("t1", "开始", "head");
        CamundaFlowCreateParam param2 = new CamundaFlowCreateParam("t3", "调用", "user-service");
        CamundaFlowCreateParam param5 = new CamundaFlowCreateParam("t6", "结束", "end");

        param.setNextList(Lists.newArrayList(param2));
        param2.setNextList(Lists.newArrayList(param5));

        // 父流程
        CamundaFlowCreateParam parent_param = new CamundaFlowCreateParam("t1", "开始", "head");
        CamundaFlowCreateParam parent_param2 = new CamundaFlowCreateParam("t3", "调用-父", "call");
        parent_param2.setSubProcessId("t-5");
        CamundaFlowCreateParam parent_param5 = new CamundaFlowCreateParam("t6", "结束", "end");
        parent_param.setNextList(Lists.newArrayList(parent_param2));
        parent_param2.setNextList(Lists.newArrayList(parent_param5));


        create(param,"测试",null,"测试");
//        create(param,"t-9","工作台");
//        create(parent_param,"t-6");

    }

    private static void create(CamundaFlowCreateParam param,String tenantId,String id,String name) {
        ProcessBuilder processBuilder= null;
        if(id == null){
            processBuilder = Bpmn.createExecutableProcess();
        }else {
            processBuilder = Bpmn.createExecutableProcess(id);

        }
        processBuilder.name(name);

        BpmnModelInstance instance = iterate(processBuilder, param,null).done();
        Bpmn.validateModel(instance);
        File file = null;
        try {
            file = File.createTempFile("bpmn-model-api-",".bpmn");
        } catch (IOException e) {
            e.printStackTrace();
        }
        Bpmn.writeModelToFile(file,instance);

        MultiValueMap<String, Object> multiValueMap = new LinkedMultiValueMap<>();

        multiValueMap.add("*", new FileSystemResource(file));
        multiValueMap.add("tenant-id", tenantId);//租户ID
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(multiValueMap, headers);
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, files, String.class);
        String responseStr= responseEntity.getBody();
        JSONObject jsonObject = JSON.parseObject(responseStr);
        System.out.println("成功" );
        System.out.println(responseEntity.getBody() );
        JSONObject jsonObject1= jsonObject.getJSONObject("deployedProcessDefinitions");
        JSONObject d = (JSONObject) jsonObject1.values().stream().findFirst().get();
        System.out.println(d.getString("key"));
    }

// 重点方法,
    private static AbstractFlowNodeBuilder iterate(ProcessBuilder processBuilder, CamundaFlowCreateParam p, AbstractFlowNodeBuilder point) {
        if (p == null) {
            return point;
        }
        switch (p.getType()) {
            case "head":
                point = processBuilder.startEvent(p.getId()).name(p.getName());
                forcachListNest(processBuilder, p, point);
                break;
            case "end":
                point = point.endEvent(p.getId()).name(p.getName());
                break;
            case "service":
                ServiceTask serviceTask = point.serviceTask(p.getId()).name(p.getName()).getElement();
                if(StringUtils.isNotBlank(p.getCamundaExpression()) ){
                    serviceTask.setCamundaExpression(p.getCamundaExpression());
                }
                point= serviceTask.builder();
                forcachListNest(processBuilder, p, point);
                break;
            case "user-service":
                point=point.userTask(p.getId()).name(p.getName());
                forcachListNest(processBuilder, p, point);
                break;
            case "call":

                CallActivity callActivity = point.callActivity(p.getId()).name(p.getName()).calledElement(p.getSubProcessId()).getElement();
                CamundaIn param = callActivity.getModelInstance().newInstance(CamundaIn.class);
                param.setCamundaVariables("all");
                callActivity.builder().addExtensionElement(param);
                point = callActivity.builder();
                forcachListNest(processBuilder, p, point);
                break;
            case "gateway":
                point = point.exclusiveGateway().id(p.getId()).name(p.getName());
                point = point.condition("yes","#{fine}");
                point = iterate(null,p.getNextList().get(0), point);
                point = point.moveToLastGateway().condition("no","#{!fine}");
                iterate(null,p.getNextList().get(1),point );
                break;
            default:
                break;
        }
        System.out.println("p="+p);


        return point;
    }

    private static void forcachListNest(ProcessBuilder processBuilder, CamundaFlowCreateParam p, AbstractFlowNodeBuilder point) {
        List<CamundaFlowCreateParam> nextList= p.getNextList();
        if(nextList != null){
            for(CamundaFlowCreateParam param:nextList){
                iterate(processBuilder, param, point);
            }
        }
    }

}
@Data
public class CamundaFlowCreateParam {

    // 流程id
    private String id;
    private String name;
     // head end user_task service
    private String type;
    //子流程id
    private String subProcessId;
    private String camundaExpression;

    private List<CamundaFlowCreateParam> nextList;

    public CamundaFlowCreateParam(String id, String name, String type) {
        this.id = id;
        this.name = name;
        this.type = type;
    }


}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Freemarker是一个模板引擎,可以用来生成各种动态内容,包括XML。 要使用Freemarker生成动态XML,首先需要定义一个XML模板。这个模板中包含了XML的结构和一些占位符,用于插入动态数据。可以使用Freemarker的语法来定义这些占位符,比如使用<#if>标签来进行条件判断,或者使用<#list>标签来循环生成XML节点。 接下来,我们需要准备一些数据,用于填充XML模板中的占位符。这些数据可以是一个Java对象,也可以是一个Map对象。我们可以将这些数据传递给Freemarker的模板引擎,并使用模板引擎的API来将数据和模板进行合并,生成最终的动态XML生成动态XML的过程大致如下: 1. 定义XML模板,包含XML的结构和占位符。 2. 准备数据,用于填充占位符。 3. 使用Freemarker的模板引擎将数据和模板进行合并,生成最终的XML。 以下是一个简单示例,生成一个包含动态数据的XMLXML模板 ("template.xml"): ```xml <root> <message>${message}</message> <items> <#list items as item> <item>${item}</item> </#list> </items> </root> ``` Java代码: ```java import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import java.io.IOException; import java.io.StringWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class GenerateDynamicXml { public static void main(String[] args) { // 准备数据 Map<String, Object> data = new HashMap<>(); data.put("message", "Hello, Freemarker!"); List<String> items = new ArrayList<>(); items.add("Item 1"); items.add("Item 2"); items.add("Item 3"); data.put("items", items); // 配置Freemarker Configuration configuration = new Configuration(Configuration.VERSION_2_3_28); configuration.setClassForTemplateLoading(GenerateDynamicXml.class, "/"); configuration.setDefaultEncoding("UTF-8"); try { // 加载模板 Template template = configuration.getTemplate("template.xml"); // 合并数据和模板 StringWriter writer = new StringWriter(); template.process(data, writer); // 打印生成XML System.out.println(writer.toString()); } catch (IOException | TemplateException e) { e.printStackTrace(); } } } ``` 以上代码会生成如下的动态XML: ```xml <root> <message>Hello, Freemarker!</message> <items> <item>Item 1</item> <item>Item 2</item> <item>Item 3</item> </items> </root> ``` 通过这个示例,我们可以看到,Freemarker非常灵活,可以根据数据动态生成各种格式的内容,包括XML

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值