(二)springboot2.7.6集成activit5.23.0之集成设计器
创始人
2024-11-16 07:03:47
0

引入官方流程设计器

1. activiti-webapp-explorer2-5.23.0.war项目并解压。

2.将文件夹diagram-viewer和editor-app以及modeler.html拷贝到项目resources/static目录下:

顺便说一下:

  • 在Spring Boot中,静态资源的访问顺序是先找static,然后是public,最后是resources。通常推荐使用static作为资源的目录名,因为它是Spring Boot静态资源默认的目录名,其他两个通常作为备用选项。
  • 项目启动时默认会自动部署processes目录下的任何BPMN 2.0流程定义。

3.查看editor-app/configuration/url-config.js

var KISBPM = KISBPM || {};  KISBPM.URL = {      getModel: function(modelId) {         return ACTIVITI.CONFIG.contextRoot + '/model/' + modelId + '/json';     },      getStencilSet: function() {         return ACTIVITI.CONFIG.contextRoot + '/editor/stencilset?version=' + Date.now();     },      putModel: function(modelId) {         return ACTIVITI.CONFIG.contextRoot + '/model/' + modelId + '/save';     } };

从上面,我们可以看到3个接口getModel、getStencilSet和putModel。

  • getModel:解析模型为json。
  • getStencilSet:获取stencilset.json(流程设计器标签)。
  • putModel:保存模型。

其中ACTIVITI.CONFIG.contextRoot的值,在editor-app/app-cfg.js文件中定义:

'use strict';  var ACTIVITI = ACTIVITI || {};  ACTIVITI.CONFIG = { 	'contextRoot' : '/activiti-explorer/service', };

4.实现接口getModel、getStencilSet和putModel。

其实有现成的已实现,我们只需要添加activiti-modeler依赖。并将activiti-modeler-5.22.0-sources.jar并解压,将其中的三个类拷到项目中:

  • org.activiti.rest.editor.model.ModelEditorJsonRestResource.java 获取模型json数据
  • org.activiti.rest.editor.main.StencilsetRestResource.java 获取stencilset.json(流程设计器标签)
  • org.activiti.rest.editor.model.ModelSaveRestResource.java 保存模型。

pom.xml中添加依赖:

     	    org.activiti 	    activiti-modeler 	    ${activiti.version} 	
/* Licensed under the Apache License, Version 2.0 (the "License");  * you may not use this file except in compliance with the License.  * You may obtain a copy of the License at  *   *      http://www.apache.org/licenses/LICENSE-2.0  *   * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an "AS IS" BASIS,  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  * See the License for the specific language governing permissions and  * limitations under the License.  */ package org.activiti.rest.editor.model;  import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream;  import org.activiti.editor.constants.ModelDataJsonConstants; import org.activiti.engine.ActivitiException; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Model; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.transcoder.image.PNGTranscoder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController;  import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode;  /**  * @author Tijs Rademakers  */ @RestController public class ModelSaveRestResource implements ModelDataJsonConstants {      protected static final Logger LOGGER = LoggerFactory.getLogger(ModelSaveRestResource.class);    @Autowired   private RepositoryService repositoryService;      @Autowired   private ObjectMapper objectMapper;      @RequestMapping(value="/model/{modelId}/save", method = RequestMethod.PUT)   @ResponseStatus(value = HttpStatus.OK)   public void saveModel(@PathVariable String modelId, @RequestBody MultiValueMap values) {     try {              Model model = repositoryService.getModel(modelId);              ObjectNode modelJson = (ObjectNode) objectMapper.readTree(model.getMetaInfo());              modelJson.put(MODEL_NAME, values.getFirst("name"));       modelJson.put(MODEL_DESCRIPTION, values.getFirst("description"));       model.setMetaInfo(modelJson.toString());       model.setName(values.getFirst("name"));              repositoryService.saveModel(model);              repositoryService.addModelEditorSource(model.getId(), values.getFirst("json_xml").getBytes("utf-8"));              InputStream svgStream = new ByteArrayInputStream(values.getFirst("svg_xml").getBytes("utf-8"));       TranscoderInput input = new TranscoderInput(svgStream);              PNGTranscoder transcoder = new PNGTranscoder();       // Setup output       ByteArrayOutputStream outStream = new ByteArrayOutputStream();       TranscoderOutput output = new TranscoderOutput(outStream);              // Do the transformation       transcoder.transcode(input, output);       final byte[] result = outStream.toByteArray();       repositoryService.addModelEditorSourceExtra(model.getId(), result);       outStream.close();            } catch (Exception e) {       LOGGER.error("Error saving model", e);       throw new ActivitiException("Error saving model", e);     }   } } 
/* Licensed under the Apache License, Version 2.0 (the "License");  * you may not use this file except in compliance with the License.  * You may obtain a copy of the License at  *   *      http://www.apache.org/licenses/LICENSE-2.0  *   * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an "AS IS" BASIS,  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  * See the License for the specific language governing permissions and  * limitations under the License.  */ package org.activiti.rest.editor.model;  import org.activiti.editor.constants.ModelDataJsonConstants; import org.activiti.engine.ActivitiException; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Model; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController;  import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode;  /**  * @author Tijs Rademakers  */ @RestController public class ModelEditorJsonRestResource implements ModelDataJsonConstants {      protected static final Logger LOGGER = LoggerFactory.getLogger(ModelEditorJsonRestResource.class);      @Autowired   private RepositoryService repositoryService;      @Autowired   private ObjectMapper objectMapper;      @RequestMapping(value="/model/{modelId}/json", method = RequestMethod.GET, produces = "application/json")   public ObjectNode getEditorJson(@PathVariable String modelId) {     ObjectNode modelNode = null;          Model model = repositoryService.getModel(modelId);            if (model != null) {       try {         if (StringUtils.isNotEmpty(model.getMetaInfo())) {           modelNode = (ObjectNode) objectMapper.readTree(model.getMetaInfo());         } else {           modelNode = objectMapper.createObjectNode();           modelNode.put(MODEL_NAME, model.getName());         }         modelNode.put(MODEL_ID, model.getId());         ObjectNode editorJsonNode = (ObjectNode) objectMapper.readTree(             new String(repositoryService.getModelEditorSource(model.getId()), "utf-8"));         modelNode.put("model", editorJsonNode);                } catch (Exception e) {         LOGGER.error("Error creating model JSON", e);         throw new ActivitiException("Error creating model JSON", e);       }     }     return modelNode;   } } 
/* Licensed under the Apache License, Version 2.0 (the "License");  * you may not use this file except in compliance with the License.  * You may obtain a copy of the License at  *   *      http://www.apache.org/licenses/LICENSE-2.0  *   * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an "AS IS" BASIS,  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  * See the License for the specific language governing permissions and  * limitations under the License.  */ package org.activiti.rest.editor.main;  import java.io.InputStream;  import org.activiti.engine.ActivitiException; import org.apache.commons.io.IOUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController;  /**  * @author Tijs Rademakers  */ @RestController public class StencilsetRestResource {      @RequestMapping(value="/editor/stencilset", method = RequestMethod.GET, produces = "application/json;charset=utf-8")   public @ResponseBody String getStencilset() {     InputStream stencilsetStream = this.getClass().getClassLoader().getResourceAsStream("stencilset.json");     try {       return IOUtils.toString(stencilsetStream, "utf-8");     } catch (Exception e) {       throw new ActivitiException("Error while loading stencil set", e);     }   } } 

5.为了方便测试,我们创建一个ModelController类。写一个创建模型并打开流程设计器的接口:

package xpl.study.activiti.controller;   import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import org.activiti.editor.constants.ModelDataJsonConstants; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Model; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;  import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;  @RestController @RequestMapping("/model") public class ModelController {      @Autowired     private RepositoryService repositoryService;     @Autowired     private ObjectMapper objectMapper;      /**      *  创建模型后,打开流程设计器      * @param request      * @param response      */     @GetMapping("/create")     public void create(HttpServletRequest request, HttpServletResponse response) {         try {             //初始化一个空模型             Model model = repositoryService.newModel();             //设置一些默认信息             String name = request.getParameter("name");             String description = request.getParameter("description");             String key = request.getParameter("key");             if (name == null || name == ""){                 name = "";             }             if (description == null || description == ""){                 description = "";             }             if (key == null || key == ""){                 key = "";             }              ObjectNode modelNode = objectMapper.createObjectNode();             modelNode.put(ModelDataJsonConstants.MODEL_NAME, name);             modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description);             modelNode.put(ModelDataJsonConstants.MODEL_REVISION, 1);              model.setName(name);             model.setKey(key);             model.setMetaInfo(modelNode.toString());              // 保存模型             repositoryService.saveModel(model);             String id = model.getId();              //完善ModelEditorSource             ObjectNode editorNode = objectMapper.createObjectNode();             editorNode.put("id", "canvas");             editorNode.put("resourceId", "canvas");              // 属性             ObjectNode propertiesNode = objectMapper.createObjectNode();             propertiesNode.put("process_id", model.getKey());             propertiesNode.put("name", model.getName());             editorNode.set("properties", propertiesNode);               // 模板             ObjectNode stencilSetNode = objectMapper.createObjectNode();             stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#");             editorNode.put("stencilset", stencilSetNode);              //添加模型编辑器资源 act_ge_bytearray表会新增一条数据             repositoryService.addModelEditorSource(id, editorNode.toString().getBytes("utf-8"));                          // 重定向到设计器界面             response.sendRedirect(request.getContextPath() + "/modeler.html?modelId=" + id);         } catch (IOException e) {             e.printStackTrace();         }     } }

6. 试运行看看效果。

项目启动后,报错[processes/]不存在。

 class path resource [processes/] cannot be resolved to URL because it does not exist。两种处理方法
(1)在resource目录下添加processes文件夹,并且文件夹不能为空
(2)在application.properties下家配置

#启动报错class path resource [processes/] cannot be resolved to URL because it does not exist
spring.activiti.check-process-definitions=false

启动时不检查流程文件。我这里添加个one-task­process.bpmn20.xml文件。

  	 		 		 		 		 		 	 

浏览器输入地址:http://localhost:8080/model/create 访问。结果如下图:

发现创建模型成功了,并重定向了。但是页面一片空白。按F12刷新,查看Network可以看到如下404错误。

7.解决上面404问题要改2个地方。

一是/activiti-explorer/service这个路径与我们项目不符合,所以需要修改editor-app/app-cfg.js。

ACTIVITI.CONFIG = { 	//'contextRoot' : '/activiti-explorer/service', 	'contextRoot' : '', };

二是这个是由于新增的那3个接口没有扫描加载到spring容器管理,需要在启动类的上添加@ComponentScan注解。

package xpl.study.activiti;  import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; import org.activiti.engine.TaskService; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @ComponentScan({"xpl.study.activiti","org.activiti.rest"}) @SpringBootApplication(exclude = { org.activiti.spring.boot.SecurityAutoConfiguration.class, 		org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class }) public class StudyActivitiApplication {  	public static void main(String[] args) { 		SpringApplication.run(StudyActivitiApplication.class, args); 	}  } 

 重启后,再次创建模型访问,发现还是报错:

8.汉化。

这个是StencilsetRestResource获取stencilset.json文件失败导致的,这个文件一下忘记在哪里获取的了,目前有一个汉化版本的,将这个文件放入resources下面就可以了:

{   "title" : "流程编辑器",   "namespace" : "http://b3mn.org/stencilset/bpmn2.0#",   "description" : "BPMN流程编辑器",   "propertyPackages" : [ {     "name" : "process_idpackage",     "properties" : [ {       "id" : "process_id",       "type" : "String",       "title" : "流程标识",       "value" : "process",       "description" : "Unique identifier of the process definition.",       "popular" : true     } ]   }, {     "name" : "overrideidpackage",     "properties" : [ {       "id" : "overrideid",       "type" : "String",       "title" : "主键(ID)",       "value" : "",       "description" : "流程唯一标识.",       "popular" : true     } ]   }, {     "name" : "namepackage",     "properties" : [ {       "id" : "name",       "type" : "String",       "title" : "名称",       "value" : "",       "description" : "BPMN元素名称.",       "popular" : true,       "refToView" : "text_name"     } ]   }, {     "name" : "documentationpackage",     "properties" : [ {       "id" : "documentation",       "type" : "Text",       "title" : "描述信息",       "value" : "",       "description" : "BPMN元素描述.",       "popular" : true     } ]   }, {     "name" : "process_authorpackage",     "properties" : [ {       "id" : "process_author",       "type" : "String",       "title" : "流程作者",       "value" : "",       "description" : "流程定义者姓名.",       "popular" : true     } ]   }, {     "name" : "process_versionpackage",     "properties" : [ {       "id" : "process_version",       "type" : "String",       "title" : "流程版本",       "value" : "",       "description" : "标识文档版本为目的.",       "popular" : true     } ]   }, {     "name" : "process_namespacepackage",     "properties" : [ {       "id" : "process_namespace",       "type" : "String",       "title" : "目标名称空间",       "value" : "http://www.activiti.org/processdef",       "description" : "工作流目标命名空间.",       "popular" : true     } ]   }, {     "name" : "asynchronousdefinitionpackage",     "properties" : [ {       "id" : "asynchronousdefinition",       "type" : "Boolean",       "title" : "异步",       "value" : "false",       "description" : "定义为一个异步任务.",       "popular" : true     } ]   }, {     "name" : "exclusivedefinitionpackage",     "properties" : [ {       "id" : "exclusivedefinition",       "type" : "Boolean",       "title" : "互斥任务",       "value" : "false",       "description" : "定义为一个互斥任务.",       "popular" : true     } ]   }, {     "name" : "executionlistenerspackage",     "properties" : [ {       "id" : "executionlisteners",       "type" : "multiplecomplex",       "title" : "执行监听器",       "value" : "",       "description" : "Listeners for an activity, process, sequence flow, start and end event.",       "popular" : true     } ]   }, {     "name" : "tasklistenerspackage",     "properties" : [ {       "id" : "tasklisteners",       "type" : "multiplecomplex",       "title" : "任务监听器",       "value" : "",       "description" : "监听用户任务.",       "popular" : true     } ]   }, {     "name" : "eventlistenerspackage",     "properties" : [ {       "id" : "eventlisteners",       "type" : "multiplecomplex",       "title" : "事件监听器",       "value" : "",       "description" : "Listeners for any event happening in the Activiti Engine. It's also possible to rethrow the event as a signal, message or error event",       "popular" : true     } ]   }, {     "name" : "usertaskassignmentpackage",     "properties" : [ {       "id" : "usertaskassignment",       "type" : "Complex",       "title" : "分配用户",       "value" : "",       "description" : "分配任务给用户",       "popular" : true     } ]   }, {     "name" : "formpropertiespackage",     "properties" : [ {       "id" : "formproperties",       "type" : "Complex",       "title" : "表单属性",       "value" : "",       "description" : "定义表单属性",       "popular" : true     } ]   }, {     "name" : "formkeydefinitionpackage",     "properties" : [ {       "id" : "formkeydefinition",       "type" : "String",       "title" : "表单编号",       "value" : "",       "description" : "用户任务表单编号.",       "popular" : true     } ]   }, {     "name" : "duedatedefinitionpackage",     "properties" : [ {       "id" : "duedatedefinition",       "type" : "String",       "title" : "到期时间",       "value" : "",       "description" : "用户任务到期时间.",       "popular" : true     } ]   }, {     "name" : "prioritydefinitionpackage",     "properties" : [ {       "id" : "prioritydefinition",       "type" : "String",       "title" : "优先级",       "value" : "",       "description" : "用户任务的优先级.",       "popular" : true     } ]   }, {     "name" : "servicetaskclasspackage",     "properties" : [ {       "id" : "servicetaskclass",       "type" : "String",       "title" : "类",       "value" : "",       "description" : "Class that implements the service task logic.",       "popular" : true     } ]   }, {     "name" : "servicetaskexpressionpackage",     "properties" : [ {       "id" : "servicetaskexpression",       "type" : "String",       "title" : "表达式",       "value" : "",       "description" : "服务任务 logic defined with an expression.",       "popular" : true     } ]   }, {     "name" : "servicetaskdelegateexpressionpackage",     "properties" : [ {       "id" : "servicetaskdelegateexpression",       "type" : "String",       "title" : "委托表达式",       "value" : "",       "description" : "服务任务 logic defined with a delegate expression.",       "popular" : true     } ]   }, {     "name" : "servicetaskfieldspackage",     "properties" : [ {       "id" : "servicetaskfields",       "type" : "Complex",       "title" : "类字段",       "value" : "",       "description" : "Field extensions",       "popular" : true     } ]   }, {     "name" : "servicetaskresultvariablepackage",     "properties" : [ {       "id" : "servicetaskresultvariable",       "type" : "String",       "title" : "结果变量名",       "value" : "",       "description" : "Process variable name to store the service task result.",       "popular" : true     } ]   }, {     "name" : "scriptformatpackage",     "properties" : [ {       "id" : "scriptformat",       "type" : "String",       "title" : "脚本格式",       "value" : "",       "description" : "Script format of the script task.",       "popular" : true     } ]   }, {     "name" : "scripttextpackage",     "properties" : [ {       "id" : "scripttext",       "type" : "Text",       "title" : "脚本",       "value" : "",       "description" : "Script text of the script task.",       "popular" : true     } ]   }, {     "name" : "ruletask_rulespackage",     "properties" : [ {       "id" : "ruletask_rules",       "type" : "String",       "title" : "规则",       "value" : "",       "description" : "Rules of the rule task.",       "popular" : true     } ]   }, {     "name" : "ruletask_variables_inputpackage",     "properties" : [ {       "id" : "ruletask_variables_input",       "type" : "String",       "title" : "输入变量",       "value" : "",       "description" : "Input variables of the rule task.",       "popular" : true     } ]   }, {     "name" : "ruletask_excludepackage",     "properties" : [ {       "id" : "ruletask_exclude",       "type" : "Boolean",       "title" : "排除",       "value" : "false",       "description" : "Use the rules property as exclusion.",       "popular" : true     } ]   }, {     "name" : "ruletask_resultpackage",     "properties" : [ {       "id" : "ruletask_result",       "type" : "String",       "title" : "结果变量",       "value" : "",       "description" : "Result variable of the rule task.",       "popular" : true     } ]   }, {     "name" : "mailtasktopackage",     "properties" : [ {       "id" : "mailtaskto",       "type" : "Text",       "title" : "至",       "value" : "",       "description" : "The recipients if the e-mail. Multiple recipients are defined in a comma-separated list.",       "popular" : true     } ]   }, {     "name" : "mailtaskfrompackage",     "properties" : [ {       "id" : "mailtaskfrom",       "type" : "Text",       "title" : "表单",       "value" : "",       "description" : "The sender e-mail address. If not provided, the default configured from address is used.",       "popular" : true     } ]   }, {     "name" : "mailtasksubjectpackage",     "properties" : [ {       "id" : "mailtasksubject",       "type" : "Text",       "title" : "主题",       "value" : "",       "description" : "The subject of the e-mail.",       "popular" : true     } ]   }, {     "name" : "mailtaskccpackage",     "properties" : [ {       "id" : "mailtaskcc",       "type" : "Text",       "title" : "抄送",       "value" : "",       "description" : "The cc's of the e-mail. Multiple recipients are defined in a comma-separated list",       "popular" : true     } ]   }, {     "name" : "mailtaskbccpackage",     "properties" : [ {       "id" : "mailtaskbcc",       "type" : "Text",       "title" : "隐藏抄送",       "value" : "",       "description" : "The bcc's of the e-mail. Multiple recipients are defined in a comma-separated list",       "popular" : true     } ]   }, {     "name" : "mailtasktextpackage",     "properties" : [ {       "id" : "mailtasktext",       "type" : "Text",       "title" : "文本",       "value" : "",       "description" : "The content of the e-mail, in case one needs to send plain none-rich e-mails. Can be used in combination with html, for e-mail clients that don't support rich content. The client will then fall back to this text-only alternative.",       "popular" : true     } ]   }, {     "name" : "mailtaskhtmlpackage",     "properties" : [ {       "id" : "mailtaskhtml",       "type" : "Text",       "title" : "Html",       "value" : "",       "description" : "A piece of HTML that is the content of the e-mail.",       "popular" : true     } ]   }, {     "name" : "mailtaskcharsetpackage",     "properties" : [ {       "id" : "mailtaskcharset",       "type" : "String",       "title" : "字符集(编码格式)",       "value" : "",       "description" : "修改邮件字符集,是许多除英语之外的语言所必须的. ",       "popular" : true     } ]   }, {     "name" : "callactivitycalledelementpackage",     "properties" : [ {       "id" : "callactivitycalledelement",       "type" : "String",       "title" : "调用元素",       "value" : "",       "description" : "流程引用.",       "popular" : true     } ]   }, {     "name" : "callactivityinparameterspackage",     "properties" : [ {       "id" : "callactivityinparameters",       "type" : "Complex",       "title" : "输入参数",       "value" : "",       "description" : "Definition of the input parameters",       "popular" : true     } ]   }, {     "name" : "callactivityoutparameterspackage",     "properties" : [ {       "id" : "callactivityoutparameters",       "type" : "Complex",       "title" : "输出参数",       "value" : "",       "description" : "Definition of the output parameters",       "popular" : true     } ]   }, {     "name" : "cameltaskcamelcontextpackage",     "properties" : [ {       "id" : "cameltaskcamelcontext",       "type" : "String",       "title" : "Camel context",       "value" : "",       "description" : "An optional camel context definition, if left empty the default is used.",       "popular" : true     } ]   }, {     "name" : "muletaskendpointurlpackage",     "properties" : [ {       "id" : "muletaskendpointurl",       "type" : "String",       "title" : "Endpoint url",       "value" : "",       "description" : "A required endpoint url to sent the message to Mule.",       "popular" : true     } ]   }, {     "name" : "muletasklanguagepackage",     "properties" : [ {       "id" : "muletasklanguage",       "type" : "String",       "title" : "语言",       "value" : "",       "description" : "A required definition for the language to resolve the payload expression, like juel.",       "popular" : true     } ]   }, {     "name" : "muletaskpayloadexpressionpackage",     "properties" : [ {       "id" : "muletaskpayloadexpression",       "type" : "String",       "title" : "Payload expression",       "value" : "",       "description" : "A required definition for the payload of the message sent to Mule.",       "popular" : true     } ]   }, {     "name" : "muletaskresultvariablepackage",     "properties" : [ {       "id" : "muletaskresultvariable",       "type" : "String",       "title" : "Result variable",       "value" : "",       "description" : "An optional result variable for the payload returned.",       "popular" : true     } ]   }, {     "name" : "conditionsequenceflowpackage",     "properties" : [ {       "id" : "conditionsequenceflow",       "type" : "Complex",       "title" : "流条件",       "value" : "",       "description" : "The condition of the sequence flow",       "popular" : true     } ]   }, {     "name" : "defaultflowpackage",     "properties" : [ {       "id" : "defaultflow",       "type" : "Boolean",       "title" : "默认流",       "value" : "false",       "description" : "Define the sequence flow as default",       "popular" : true,       "refToView" : "default"     } ]   }, {     "name" : "conditionalflowpackage",     "properties" : [ {       "id" : "conditionalflow",       "type" : "Boolean",       "title" : "条件流",       "value" : "false",       "description" : "Define the sequence flow with a condition",       "popular" : true     } ]   }, {     "name" : "timercycledefinitionpackage",     "properties" : [ {       "id" : "timercycledefinition",       "type" : "String",       "title" : "时间周期(e.g. R3/PT10H)",       "value" : "",       "description" : "Define the timer with a ISO-8601 cycle.",       "popular" : true     } ]   }, {     "name" : "timerdatedefinitionpackage",     "properties" : [ {       "id" : "timerdatedefinition",       "type" : "String",       "title" : "采用ISO-8601日期时间",       "value" : "",       "description" : "Define the timer with a ISO-8601 date definition.",       "popular" : true     } ]   }, {     "name" : "timerdurationdefinitionpackage",     "properties" : [ {       "id" : "timerdurationdefinition",       "type" : "String",       "title" : "持续时间(e.g. PT5M)",       "value" : "",       "description" : "Define the timer with a ISO-8601 duration.",       "popular" : true     } ]   }, {     "name" : "timerenddatedefinitionpackage",     "properties" : [ {       "id" : "timerenddatedefinition",       "type" : "String",       "title" : "Time End Date in ISO-8601",       "value" : "",       "description" : "Define the timer with a ISO-8601 duration.",       "popular" : true     } ]   }, {     "name" : "messagerefpackage",     "properties" : [ {       "id" : "messageref",       "type" : "String",       "title" : "消息引用",       "value" : "",       "description" : "Define the message name.",       "popular" : true     } ]   }, {     "name" : "signalrefpackage",     "properties" : [ {       "id" : "signalref",       "type" : "String",       "title" : "信号引用",       "value" : "",       "description" : "定义信号名称.",       "popular" : true     } ]   }, {     "name" : "errorrefpackage",     "properties" : [ {       "id" : "errorref",       "type" : "String",       "title" : "错误引用",       "value" : "",       "description" : "定义错误名称.",       "popular" : true     } ]   }, {     "name" : "cancelactivitypackage",     "properties" : [ {       "id" : "cancelactivity",       "type" : "Boolean",       "title" : "取消任务",       "value" : "true",       "description" : "Should the activity be cancelled",       "popular" : true,       "refToView" : [ "frame", "frame2" ]     } ]   }, {     "name" : "initiatorpackage",     "properties" : [ {       "id" : "initiator",       "type" : "String",       "title" : "启动器",       "value" : "",       "description" : "Initiator of the process.",       "popular" : true     } ]   }, {     "name" : "textpackage",     "properties" : [ {       "id" : "text",       "type" : "String",       "title" : "文本",       "value" : "",       "description" : "The text of the text annotation.",       "popular" : true,       "refToView" : "text"     } ]   }, {     "name" : "multiinstance_typepackage",     "properties" : [ {       "id" : "multiinstance_type",       "type" : "kisbpm-multiinstance",       "title" : "多实例类型",       "value" : "None",       "description" : "Repeated activity execution (parallel or sequential) can be displayed through different loop types",       "popular" : true,       "refToView" : "multiinstance"     } ]   }, {     "name" : "multiinstance_cardinalitypackage",     "properties" : [ {       "id" : "multiinstance_cardinality",       "type" : "String",       "title" : "基数(多实例)",       "value" : "",       "description" : "Define the cardinality of multi instance.",       "popular" : true     } ]   }, {     "name" : "multiinstance_collectionpackage",     "properties" : [ {       "id" : "multiinstance_collection",       "type" : "String",       "title" : "集合(多实例)",       "value" : "",       "description" : "Define the collection for the multi instance.",       "popular" : true     } ]   }, {     "name" : "multiinstance_variablepackage",     "properties" : [ {       "id" : "multiinstance_variable",       "type" : "String",       "title" : "元素变量(多实例)",       "value" : "",       "description" : "Define the element variable for the multi instance.",       "popular" : true     } ]   }, {     "name" : "multiinstance_conditionpackage",     "properties" : [ {       "id" : "multiinstance_condition",       "type" : "String",       "title" : "完成条件(多实例)",       "value" : "",       "description" : "Define the completion condition for the multi instance.",       "popular" : true     } ]   }, {     "name" : "isforcompensationpackage",     "properties" : [ {       "id" : "isforcompensation",       "type" : "Boolean",       "title" : "是否补偿",       "value" : "false",       "description" : "A flag that identifies whether this activity is intended for the purposes of compensation.",       "popular" : true,       "refToView" : "compensation"     } ]   }, {     "name" : "sequencefloworderpackage",     "properties" : [ {       "id" : "sequencefloworder",       "type" : "Complex",       "title" : "Flow order",       "value" : "",       "description" : "Order outgoing sequence flows.",       "popular" : true     } ]   }, {     "name" : "signaldefinitionspackage",     "properties" : [ {       "id" : "signaldefinitions",       "type" : "multiplecomplex",       "title" : "信号定义",       "value" : "",       "description" : "Signal definitions",       "popular" : true     } ]   }, {     "name" : "messagedefinitionspackage",     "properties" : [ {       "id" : "messagedefinitions",       "type" : "multiplecomplex",       "title" : "消息定义",       "value" : "",       "description" : "Message definitions",       "popular" : true     } ]   }, {     "name" : "istransactionpackage",     "properties" : [ {       "id" : "istransaction",       "type" : "Boolean",       "title" : "Is a transaction sub process",       "value" : "false",       "description" : "A flag that identifies whether this sub process is of type transaction.",       "popular" : true,       "refToView" : "border"     } ]   } ],   "stencils" : [ {     "type" : "node",     "id" : "BPMNDiagram",     "title" : "BPMN-Diagram",     "description" : "A BPMN 2.0 diagram.",     "view" : "\n\n  \n  \n    \n    \n    \t\n  \n",     "icon" : "diagram.png",     "groups" : [ "Diagram" ],     "mayBeRoot" : true,     "hide" : true,     "propertyPackages" : [ "process_idpackage", "namepackage", "documentationpackage", "process_authorpackage", "process_versionpackage", "process_namespacepackage", "executionlistenerspackage", "eventlistenerspackage", "signaldefinitionspackage", "messagedefinitionspackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ ]   }, {     "type" : "node",     "id" : "StartNoneEvent",     "title" : "开始事件",     "description" : "A start event without a specific trigger",     "view" : "\n\n  \n  \n  \t\n  \n  \n    \n\t\n  \n",     "icon" : "startevent/none.png",     "groups" : [ "开始事件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "initiatorpackage", "formkeydefinitionpackage", "formpropertiespackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "sequence_start", "Startevents_all", "StartEventsMorph", "all" ]   }, {     "type" : "node",     "id" : "StartTimerEvent",     "title" : "定时开始事件",     "description" : "有定时任务触发器的开始事件",     "view" : "\n\n  \n  \n  \t\n  \n  \n    \n    \n    \n    \n   \n\t\n  \n",     "icon" : "startevent/timer.png",     "groups" : [ "开始事件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "timercycledefinitionpackage", "timerdatedefinitionpackage", "timerdurationdefinitionpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "sequence_start", "Startevents_all", "StartEventsMorph", "all" ]   }, {     "type" : "node",     "id" : "StartSignalEvent",     "title" : "信号开始事件",     "description" : "有信号触发器的开始事件.",     "view" : "\n\n  \n  \n  \t\n  \n  \n\n    \n    \n    \n\t\n  \n",     "icon" : "startevent/signal.png",     "groups" : [ "开始事件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "signalrefpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "sequence_start", "Startevents_all", "StartEventsMorph", "all" ]   }, {     "type" : "node",     "id" : "StartMessageEvent",     "title" : "消息开始事件",     "description" : "有消息触发器的开始事件.",     "view" : "\n\n  \n  \n  \t\n  \n  \n    \n    \n    \n    \n    \n\t\n  \n",     "icon" : "startevent/message.png",     "groups" : [ "开始事件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "messagerefpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "sequence_start", "Startevents_all", "StartEventsMorph", "all" ]   }, {     "type" : "node",     "id" : "StartErrorEvent",     "title" : "错误开始事件",     "description" : "捕获抛出BMP错误的开始事件.",     "view" : "\n\n  \n  \n  \t\n  \n  \n  \n    \n    \n    \n\t\n  \n",     "icon" : "startevent/error.png",     "groups" : [ "开始事件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "errorrefpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "sequence_start", "Startevents_all", "StartEventsMorph", "all" ]   }, {     "type" : "node",     "id" : "UserTask",     "title" : "用户任务",     "description" : "由特定用户完成的任务.",     "view" : "\n\n  \n  \n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \n  \n\t\n\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\n\t\n  \n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\n\t\n\t\t\n\t\n  \n",     "icon" : "activity/list/type.user.png",     "groups" : [ "任务" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage", "usertaskassignmentpackage", "formkeydefinitionpackage", "duedatedefinitionpackage", "prioritydefinitionpackage", "formpropertiespackage", "tasklistenerspackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]   }, {     "type" : "node",     "id" : "ServiceTask",     "title" : "服务任务",     "description" : "由服务逻辑自动完成的任务.",     "view" : "\n\n  \n  \n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \n  \n\t\n\t\n\t\t\n\t\t\n\t\n\t\n\t\n\t\n  \n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n  \n",     "icon" : "activity/list/type.service.png",     "groups" : [ "任务" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage", "servicetaskclasspackage", "servicetaskexpressionpackage", "servicetaskdelegateexpressionpackage", "servicetaskfieldspackage", "servicetaskresultvariablepackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]   }, {     "type" : "node",     "id" : "ScriptTask",     "title" : "脚本任务",     "description" : "由脚本逻辑自动完成的任务.",     "view" : "\n\n  \n  \n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \n  \n\t\n\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\n  \n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\n\t\n\t\t\n\t\n  \n",     "icon" : "activity/list/type.script.png",     "groups" : [ "任务" ],     "propertyPackages" : [ "scriptformatpackage", "scripttextpackage", "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]   }, {     "type" : "node",     "id" : "BusinessRule",     "title" : "业务规则任务",     "description" : "由规则逻辑自动完成的任务.",     "view" : "\n\n  \n  \n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \n  \n  \t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n    \n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\n\t\n\t\t\n\t\n  \n",     "icon" : "activity/list/type.business.rule.png",     "groups" : [ "任务" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage", "ruletask_rulespackage", "ruletask_variables_inputpackage", "ruletask_excludepackage", "ruletask_resultpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]   }, {     "type" : "node",     "id" : "ReceiveTask",     "title" : "接收任务",     "description" : "等待接收信号的任务.",     "view" : "\n\n  \n  \n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \n  \n\t\n\t\n\t\t\n\t\t\n    \n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\n\t\n\t\t\n\t\n  \n",     "icon" : "activity/list/type.receive.png",     "groups" : [ "任务" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]   }, {     "type" : "node",     "id" : "ManualTask",     "title" : "人工任务",     "description" : "无需逻辑自动完成的任务.",     "view" : "\n\n  \n  \n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \n  \n\t\n\t\n\t\t\n\t\t\n    \n    \t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\n\t\n\t\t\n\t\n  \n",     "icon" : "activity/list/type.manual.png",     "groups" : [ "任务" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]   }, {     "type" : "node",     "id" : "MailTask",     "title" : "邮件任务",     "description" : "发送邮件通知的任务.",     "view" : "\n\n  \n  \n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \n  \n\t\n\t\n\t\t\n\t\t\n    \n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\n\t\n\t\t\n\t\n  \n",     "icon" : "activity/list/type.send.png",     "groups" : [ "任务" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage", "mailtasktopackage", "mailtaskfrompackage", "mailtasksubjectpackage", "mailtaskccpackage", "mailtaskbccpackage", "mailtasktextpackage", "mailtaskhtmlpackage", "mailtaskcharsetpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]   }, {     "type" : "node",     "id" : "CamelTask",     "title" : "骆驼任务",     "description" : "An task that sends a message to Camel",     "view" : "\n\n  \n  \n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \n  \n\t\n\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\n  \n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\n\t\n\t\t\n\t\n  \n",     "icon" : "activity/list/type.camel.png",     "groups" : [ "任务" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage", "cameltaskcamelcontextpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]   }, {     "type" : "node",     "id" : "MuleTask",     "title" : "Mule任务",     "description" : "An task that sends a message to Mule",     "view" : "\n\n  \n  \n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \n  \n\t\n\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\n  \n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\n\t\n\t\t\n\t\n  \n",     "icon" : "activity/list/type.mule.png",     "groups" : [ "任务" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage", "muletaskendpointurlpackage", "muletasklanguagepackage", "muletaskpayloadexpressionpackage", "muletaskresultvariablepackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]   }, {     "type" : "node",     "id" : "SendTask",     "title" : "发送任务",     "description" : "An task that sends a message",     "view" : "\n\n  \n  \n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \n  \n\t\n\t\n\t\t\n\t\t\n    \n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\n\t\n\t\t\n\t\n  \n",     "icon" : "activity/list/type.send.png",     "groups" : [ "任务" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "Activity", "sequence_start", "sequence_end", "ActivitiesMorph", "all" ]   }, {     "type" : "node",     "id" : "SubProcess",     "title" : "子流程",     "description" : "子流程范围",     "view" : "\n\n  \n  \n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \n  \n    \n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n  \n",     "icon" : "activity/expanded.subprocess.png",     "groups" : [ "结构" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "Activity", "sequence_start", "sequence_end", "all" ]   }, {     "type" : "node",     "id" : "EventSubProcess",     "title" : "事件子流程",     "description" : "事件周日子流程范围",     "view" : "\n\n  \n  \n  \t\n  \t\n  \t\n  \t\n  \t\n  \n  \n\t\n\t\n    \t\n\t\t\n    \t\n\t\n\t\n  \n",     "icon" : "activity/event.subprocess.png",     "groups" : [ "结构" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "Activity", "all" ]   }, {     "type" : "node",     "id" : "CallActivity",     "title" : "调用活动",     "description" : "A call activity",     "view" : "\n\n  \n  \n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \t\n  \n  \n\t\n    \n\t\n\t\t\n\t\t\n    \n\t\n\t\t\n\t\n\t\n\t\n\t\t\n\t\n\n\t\n\t\t\n\t\n  \n",     "icon" : "activity/task.png",     "groups" : [ "结构" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "asynchronousdefinitionpackage", "exclusivedefinitionpackage", "executionlistenerspackage", "callactivitycalledelementpackage", "callactivityinparameterspackage", "callactivityoutparameterspackage", "multiinstance_typepackage", "multiinstance_cardinalitypackage", "multiinstance_collectionpackage", "multiinstance_variablepackage", "multiinstance_conditionpackage", "isforcompensationpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "Activity", "sequence_start", "sequence_end", "all" ]   }, {     "type" : "node",     "id" : "ExclusiveGateway",     "title" : "互斥网关",     "description" : "一个选择的网关",     "view" : "\n\n  \n  \n    \n  \t\t\t\t\t\n  \n  \n    \n    \n      \n      \n    \n\t\n\t\n\t\n  \n\n",     "icon" : "gateway/exclusive.databased.png",     "groups" : [ "网关" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "sequencefloworderpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "sequence_start", "GatewaysMorph", "sequence_end", "all" ]   }, {     "type" : "node",     "id" : "ParallelGateway",     "title" : "并行网关",     "description" : "并行处理的网关",     "view" : "\n\n   \n  \n    \n  \n  \n    \n    \n    \n\t\n\t\n  \n\n",     "icon" : "gateway/parallel.png",     "groups" : [ "网关" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "sequencefloworderpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "sequence_start", "GatewaysMorph", "sequence_end", "all" ]   }, {     "type" : "node",     "id" : "InclusiveGateway",     "title" : "包容性网关",     "description" : "An inclusive gateway",     "view" : "\n\n  \n    \n  \n  \n\n    \n    \n    \n\t\n\t\n  \n\n",     "icon" : "gateway/inclusive.png",     "groups" : [ "网关" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "sequencefloworderpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "sequence_start", "GatewaysMorph", "sequence_end", "all" ]   }, {     "type" : "node",     "id" : "EventGateway",     "title" : "事件网关",     "description" : "An event gateway",     "view" : "\n\n  \n    \n  \n  \n   \n  \t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\n\t\n\t\n\t\n\t\n  \t\n\t\n\n",     "icon" : "gateway/eventbased.png",     "groups" : [ "网关" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "sequencefloworderpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "sequence_start", "GatewaysMorph", "sequence_end", "all" ]   }, {     "type" : "node",     "id" : "BoundaryErrorEvent",     "title" : "边界错误事件",     "description" : "A boundary event that catches a BPMN error",     "view" : "\n\n  \n  \n  \t\n  \n  \n  \n    \n    \n    \n    \n\t\n  \n",     "icon" : "catching/error.png",     "groups" : [ "边界事件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "errorrefpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "sequence_start", "BoundaryEventsMorph", "IntermediateEventOnActivityBoundary" ]   }, {     "type" : "node",     "id" : "BoundaryTimerEvent",     "title" : "边界定时事件",     "description" : "A boundary event with a timer trigger",     "view" : "\n\n  \n  \n  \t\n  \n  \n  \n    \n    \t\n    \n    \n    \n    \n    \n    \n    \t\n\t\n  \n",     "icon" : "catching/timer.png",     "groups" : [ "边界事件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "timercycledefinitionpackage", "timerdatedefinitionpackage", "timerdurationdefinitionpackage", "cancelactivitypackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "sequence_start", "BoundaryEventsMorph", "IntermediateEventOnActivityBoundary" ]   }, {     "type" : "node",     "id" : "BoundarySignalEvent",     "title" : "边界信号事件",     "description" : "A boundary event with a signal trigger",     "view" : "\n\n  \n  \n  \t\n  \n  \n  \n    \n    \t\n    \n    \n    \n    \n\t\n\t\n  \n",     "icon" : "catching/signal.png",     "groups" : [ "边界事件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "signalrefpackage", "cancelactivitypackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "sequence_start", "BoundaryEventsMorph", "IntermediateEventOnActivityBoundary" ]   }, {     "type" : "node",     "id" : "BoundaryMessageEvent",     "title" : "边界消息事件",     "description" : "A boundary event with a message trigger",     "view" : "\n\n  \n  \n  \t\n  \n  \n  \n    \n    \t\n    \n    \t\n    \n    \n    \n\t\n\t\t\n\t\n\t\n\t\n  \n",     "icon" : "catching/message.png",     "groups" : [ "边界事件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "messagerefpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "sequence_start", "BoundaryEventsMorph", "IntermediateEventOnActivityBoundary" ]   }, {     "type" : "node",     "id" : "BoundaryCancelEvent",     "title" : "边界取消事件",     "description" : "A boundary cancel event",     "view" : "\n\n  \n  \n  \t\n  \n  \n  \n  \n    \n    \n    \n    \n\t\n  \n",     "icon" : "catching/cancel.png",     "groups" : [ "边界事件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "sequence_start", "BoundaryEventsMorph", "IntermediateEventOnActivityBoundary" ]   }, {     "type" : "node",     "id" : "边界补偿事件",     "title" : "Boundary compensation event",     "description" : "A boundary compensation event",     "view" : "\n\n  \n  \n  \t\n  \n  \n  \n\t\n    \n    \n    \n    \n    \n\t\n \n",     "icon" : "catching/compensation.png",     "groups" : [ "边界事件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "BoundaryEventsMorph", "IntermediateEventOnActivityBoundary", "all" ]   }, {     "type" : "node",     "id" : "CatchTimerEvent",     "title" : "中间定时器捕获事件",     "description" : "An intermediate catching event with a timer trigger",     "view" : "\n\n  \n  \n  \t\n  \n  \n  \n    \n    \t\n    \n    \n    \n    \n    \n    \n    \t\n\t\n  \n",     "icon" : "catching/timer.png",     "groups" : [ "中间捕捉事件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "timercycledefinitionpackage", "timerdatedefinitionpackage", "timerdurationdefinitionpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "sequence_start", "sequence_end", "CatchEventsMorph", "all" ]   }, {     "type" : "node",     "id" : "CatchSignalEvent",     "title" : "中间信号捕捉事件",     "description" : "An intermediate catching event with a signal trigger",     "view" : "\n\n  \n  \n  \t\n  \n  \n  \n    \n    \t\n    \n    \n    \n    \n\t\n\t\n  \n",     "icon" : "catching/signal.png",     "groups" : [ "中间捕捉事件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "signalrefpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "sequence_start", "sequence_end", "CatchEventsMorph", "all" ]   }, {     "type" : "node",     "id" : "CatchMessageEvent",     "title" : "中间消息捕捉事件",     "description" : "An intermediate catching event with a message trigger",     "view" : "\n\n  \n  \n  \t\n  \n  \n  \n    \n    \t\n    \n    \t\n    \n    \n    \n\t\n\t\t\n\t\n\t\n\t\n  \n",     "icon" : "catching/message.png",     "groups" : [ "中间捕捉事件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "messagerefpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "sequence_start", "sequence_end", "CatchEventsMorph", "all" ]   }, {     "type" : "node",     "id" : "ThrowNoneEvent",     "title" : "中间无抛出事件",     "description" : "An intermediate event without a specific trigger",     "view" : "\n\n  \n  \n  \t\n  \n  \n  \n  \n    \n    \n\t\n  \n",     "icon" : "throwing/none.png",     "groups" : [ "中间抛出事件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "ThrowEventsMorph", "sequence_start", "sequence_end", "all" ]   }, {     "type" : "node",     "id" : "ThrowSignalEvent",     "title" : "中间信号抛出事件",     "description" : "An intermediate event with a signal trigger",     "view" : "\n\n  \n  \n  \t\n  \n  \n  \n    \n    \n    \n\t\n  \n",     "icon" : "throwing/signal.png",     "groups" : [ "中间抛出事件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "signalrefpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "ThrowEventsMorph", "sequence_start", "sequence_end", "all" ]   }, {     "type" : "node",     "id" : "EndNoneEvent",     "title" : "结束事件",     "description" : "An end event without a specific trigger",     "view" : "\n\n  \n  \n  \t\n  \n  \n    \n\t\n  \n",     "icon" : "endevent/none.png",     "groups" : [ "结束事件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "EndEventsMorph", "sequence_end", "all" ]   }, {     "type" : "node",     "id" : "EndErrorEvent",     "title" : "结束错误事件",     "description" : "An end event that throws an error event",     "view" : "\n\n  \n  \n  \t\n  \n  \n  \n    \n    \n    \n\t\n  \n",     "icon" : "endevent/error.png",     "groups" : [ "结束事件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage", "errorrefpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "EndEventsMorph", "sequence_end", "all" ]   }, {     "type" : "node",     "id" : "EndCancelEvent",     "title" : "结束取消事件",     "description" : "A cancel end event",     "view" : "\n\n  \n  \n  \t\n  \n  \n    \n    \n    \n\t\n  \n",     "icon" : "endevent/cancel.png",     "groups" : [ "结束事件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "EndEventsMorph", "sequence_end", "all" ]   }, {     "type" : "node",     "id" : "EndTerminateEvent",     "title" : "结束终止事件",     "description" : "A terminate end event",     "view" : "\n\n  \n  \n  \t\n  \n  \n    \n    \n    \n\t\n  \n",     "icon" : "endevent/terminate.png",     "groups" : [ "结束事件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "executionlistenerspackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "EndEventsMorph", "sequence_end", "all" ]   }, {     "type" : "node",     "id" : "Pool",     "title" : "池",     "description" : "A pool to stucture the process definition",     "view" : "\n\n  \n  \n  \t\n  \t\n  \t\n  \t\n  \t\n  \n  \n    \n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n\t  \t\n  \t\n    \n    \n\t\n\t\n\t\n\t\n    \n    \n  \n",     "icon" : "swimlane/pool.png",     "groups" : [ "泳道" ],     "layout" : [ {       "type" : "layout.bpmn2_0.pool"     } ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "process_idpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "canContainArtifacts", "all" ]   }, {     "type" : "node",     "id" : "Lane",     "title" : "道",     "description" : "A lane to stucture the process definition",     "view" : "\n\n  \n  \n  \n     \n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n\t\n  \t\t\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n    \n\t\n  \n",     "icon" : "swimlane/lane.png",     "groups" : [ "泳道" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "PoolChild", "canContainArtifacts", "all" ]   }, {     "type" : "edge",     "id" : "SequenceFlow",     "title" : "Sequence flow",     "description" : "Sequence flow defines the execution order of activities.",     "view" : "\r\n\r\n\t\r\n\t  \t\r\n\t  \t\t\r\n\t\t\t\r\n\t  \t\r\n\t  \t\r\n\t  \t\t\r\n\t  \t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n",     "icon" : "connector/sequenceflow.png",     "groups" : [ "链接对象" ],     "layout" : [ {       "type" : "layout.bpmn2_0.sequenceflow"     } ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "conditionsequenceflowpackage", "executionlistenerspackage", "defaultflowpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "ConnectingObjectsMorph", "all" ]   }, {     "type" : "edge",     "id" : "MessageFlow",     "title" : "Message flow",     "description" : "Message flow to connect elements in different pools.",     "view" : "\r\n\r\n\t\r\n\t\t\r\n\t  \t\t\r\n\t  \t\t\r\n\t  \t\r\n\r\n\t  \t\r\n\t  \t\t\r\n\t  \t\r\n\t\r\n\t\r\n\t    \r\n\t\t\r\n\t\r\n",     "icon" : "connector/messageflow.png",     "groups" : [ "链接对象" ],     "layout" : [ {       "type" : "layout.bpmn2_0.sequenceflow"     } ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "ConnectingObjectsMorph", "all" ]   }, {     "type" : "edge",     "id" : "Association",     "title" : "Association",     "description" : "Associates a text annotation with an element.",     "view" : "\r\n\r\n\t\r\n\t    \r\n\t\t\r\n\t\r\n",     "icon" : "connector/association.undirected.png",     "groups" : [ "链接对象" ],     "layout" : [ {       "type" : "layout.bpmn2_0.sequenceflow"     } ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "ConnectingObjectsMorph", "all" ]   }, {     "type" : "edge",     "id" : "DataAssociation",     "title" : "DataAssociation",     "description" : "Associates a data element with an activity.",     "view" : "\r\n\r\n\t\r\n\t  \t\r\n\t  \t\t\r\n\t  \t\r\n\t\r\n\t\r\n\t    \r\n\t\t\r\n\t\r\n",     "icon" : "connector/association.unidirectional.png",     "groups" : [ "链接对象" ],     "layout" : [ {       "type" : "layout.bpmn2_0.sequenceflow"     } ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "ConnectingObjectsMorph", "all" ]   }, {     "type" : "node",     "id" : "TextAnnotation",     "title" : "文本注释",     "description" : "Annotates elements with description text.",     "view" : "\n\n  \n  \n  \t\n  \n  \n  \n  \n    \n    \n\t\n  \n",     "icon" : "artifact/text.annotation.png",     "groups" : [ "组件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage", "textpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "all" ]   }, {     "type" : "node",     "id" : "DataStore",     "title" : "Data store",     "description" : "Reference to a data store.",     "view" : "\r\n\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\t \t\r\n\t\t\r\n\t\t\t \r\n\t\r\n\r\n",     "icon" : "dataobject/data.store.png",     "groups" : [ "组件" ],     "propertyPackages" : [ "overrideidpackage", "namepackage", "documentationpackage" ],     "hiddenPropertyPackages" : [ ],     "roles" : [ "all" ]   } ],   "rules" : {     "cardinalityRules" : [ {       "role" : "Startevents_all",       "incomingEdges" : [ {         "role" : "SequenceFlow",         "maximum" : 0       } ]     }, {       "role" : "Endevents_all",       "outgoingEdges" : [ {         "role" : "SequenceFlow",         "maximum" : 0       } ]     } ],     "connectionRules" : [ {       "role" : "SequenceFlow",       "connects" : [ {         "from" : "sequence_start",         "to" : [ "sequence_end" ]       } ]     }, {       "role" : "Association",       "connects" : [ {         "from" : "sequence_start",         "to" : [ "TextAnnotation" ]       }, {         "from" : "sequence_end",         "to" : [ "TextAnnotation" ]       }, {         "from" : "TextAnnotation",         "to" : [ "sequence_end" ]       }, {         "from" : "BoundaryCompensationEvent",         "to" : [ "sequence_end" ]       }, {         "from" : "TextAnnotation",         "to" : [ "sequence_start" ]       }, {         "from" : "BoundaryCompensationEvent",         "to" : [ "sequence_start" ]       } ]     }, {       "role" : "DataAssociation",       "connects" : [ {         "from" : "sequence_start",         "to" : [ "DataStore" ]       }, {         "from" : "sequence_end",         "to" : [ "DataStore" ]       }, {         "from" : "DataStore",         "to" : [ "sequence_end" ]       }, {         "from" : "DataStore",         "to" : [ "sequence_start" ]       } ]     }, {       "role" : "IntermediateEventOnActivityBoundary",       "connects" : [ {         "from" : "Activity",         "to" : [ "IntermediateEventOnActivityBoundary" ]       } ]     } ],     "containmentRules" : [ {       "role" : "BPMNDiagram",       "contains" : [ "all" ]     }, {       "role" : "SubProcess",       "contains" : [ "sequence_start", "sequence_end", "from_task_event", "to_task_event", "EventSubProcess", "TextAnnotation", "DataStore" ]     }, {       "role" : "EventSubProcess",       "contains" : [ "sequence_start", "sequence_end", "from_task_event", "to_task_event", "TextAnnotation", "DataStore" ]     }, {       "role" : "Pool",       "contains" : [ "Lane" ]     }, {       "role" : "Lane",       "contains" : [ "sequence_start", "sequence_end", "EventSubProcess", "TextAnnotation", "DataStore" ]     } ],     "morphingRules" : [ {       "role" : "ActivitiesMorph",       "baseMorphs" : [ "UserTask" ],       "preserveBounds" : true     }, {       "role" : "GatewaysMorph",       "baseMorphs" : [ "ExclusiveGateway" ]     }, {       "role" : "StartEventsMorph",       "baseMorphs" : [ "StartNoneEvent" ]     }, {       "role" : "EndEventsMorph",       "baseMorphs" : [ "StartNoneEvent" ]     }, {       "role" : "CatchEventsMorph",       "baseMorphs" : [ "CatchTimerEvent" ]     }, {       "role" : "ThrowEventsMorph",       "baseMorphs" : [ "ThrowNoneEvent" ]     }, {       "role" : "BoundaryEventsMorph",       "baseMorphs" : [ "ThrowNoneEvent" ]     }, {       "role" : "BoundaryCompensationEvent",       "baseMorphs" : [ "BoundaryCompensationEvent" ]     }, {       "role" : "TextAnnotation",       "baseMorphs" : [ "TextAnnotation" ]     }, {       "role" : "DataStore",       "baseMorphs" : [ "DataStore" ]     } ]   } }

9.修复模型保存功能异常。

如下图,左侧汉化成功了。但是保存模型时报异常。

后台日志如下:

2024-08-02 22:54:24.545  WARN 19340 --- [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException:

Required request body is missing: public void org.activiti.rest.editor.model.ModelSaveRestResource.saveModel

(java.lang.String,org.springframework.util.MultiValueMap)]
 

用@RequestBody MultiValueMap values来接会报错:Required request body is missing。于是修改ModelSaveRestResource,总共修改了6个地方:

重新启动项目后,再次测试,创建模型,编辑模型,保存模型功能都测试通过。打完收工!

总结,与官方的activiti-explorer项目相比,本次集成修改了3个文件:

  • editor-app/app-cfg.js
  • ModelSaveRestResource.java
  • stencilset.json

相关内容

热门资讯

购买服务器时,除了CPU还需要... 购买服务器时,CPU的性能是核心考量之一,但还需综合考虑内存大小、存储容量、网络接口类型及速度、扩展...
为什么字符界面的Linux系统... 字符界面的Linux系统因其资源占用低、响应速度快,且不受图形界面潜在的稳定性问题影响,非常适合服务...
网络连接失败,背后的原因是什么... 无法连接到网络服务器可能由多种原因造成,包括网络连接问题、服务器故障、防火墙或安全软件设置不当、IP...
为何穿越火线新版本频繁遭遇服务... 《穿越火线》(CF)新版本更新后,服务器经常出现爆满情况,这可能是因为新版本吸引了大量玩家回归或新玩...
更换T3服务器后,需要调整哪些... 更换t3服务器后,需要更新DNS记录以指向新IP地址,检查和配置网络设置,确保安全设置与旧服务器一致...
为何有些人对微信不感冒? 有的人很少看微信可能是因为他们更喜欢面对面的交流,或者更倾向于使用其他社交媒体平台。也有可能是为了减...
唱吧私人歌单有哪些独特功能? 唱吧私人歌单是指在唱吧应用中,用户可以创建的一个只属于自己的歌单,其中可以添加自己喜欢的歌曲。这个歌...
服务器购买指南,了解其用途及必... 购买服务器可用于部署网站、应用和数据库,提供数据存储和备份,运行企业资源规划(ERP)系统,支持电子...
为什么QQ资料卡显示为空? QQ资料卡没有内容可能是因为个人隐私设置、网络问题或软件故障。检查隐私设置确保信息可见,重启网络或Q...
微信新消息横幅功能如何工作? 微信新消息横幅是指在微信应用中,当有新的消息到来时,屏幕顶部会显示一个横幅通知,展示发消息人的头像和...