ServiceTask自定义属性

背景

现在需要有一个节点,需要在流程到达这个节点的时候,需要将当前流程表单的一些参数作为参数调用外部的http地址,如果这个地址返回了成功,那么这个节点就继续往下走。

分析

按照上面的需求,我们需要做的主要是以下功能

  • 入参,勾选表单的参数
  • 调用地址
  • 调用方式(GET\POST)
  • 返回值判断(外部接口按照我们的定义统一返回就行)
  • 异常处理
    • 邮件
    • 企业微信告警

实现

前端部分

用的是bpmn.js的插件,需要自定义属性,最终展示效果为:


ServiceTask自定义属性_第1张图片
流程编辑页

设置完右侧的属性之后,我们这个节点的属性就设置完毕了。

最终提交的xml类似于下面这种:



    
        
            
                
            
        
        
            Flow_0ca559g
        
        
        
            Flow_0ca559g
            Flow_0a6iosp
        
        
        
            Flow_0a6iosp
            Flow_01wlhjl
        
        
            Flow_01wlhjl
            Flow_021bick
            Flow_1rt8i2h
        
        
        
        
        
            Flow_021bick
            Flow_1xurbpo
        
        
            Flow_1rt8i2h
            Flow_162pjte
        
        
        
        
            Flow_162pjte
            Flow_1xurbpo
        
    
    
        
            
                
                
            
            
                
                
            
            
                
                
            
            
                
                
                
                
                    
                
            
            
                
                
                
                
                    
                
            
            
                
                
                
                
            
            
                
                
                
                
            
            
                
                
                    
                
            
            
                
            
            
                
            
            
                
            
            
                
            
            
                
            
            
                
            
        
    

后端部分

因为都是自定义属性,所以我们需要写一个转化类的代码

部署转化类代码:

public class CustomServiceTaskXMLConverter extends ServiceTaskXMLConverter {

   @Override
   protected BaseElement convertXMLToElement(XMLStreamReader xtr, BpmnModel model) throws Exception {
      ServiceTask serviceTask = new ServiceTask();
      // 省略一些代码
      // 设置自定义属性到customProperties
      List customProperties = new ArrayList<>();
      ActivitiConstants.SERVICE_TASK_ATTRS[] values = ActivitiConstants.SERVICE_TASK_ATTRS.values();
      for ( ActivitiConstants.SERVICE_TASK_ATTRS serviceTaskAttrs : values ) {
        String attributeValue = xtr.getAttributeValue(null, serviceTaskAttrs.getAttrName());
        if (StringUtils.isNotEmpty(attributeValue)) {
            CustomProperty customProperty = new CustomProperty();
            customProperty.setId(serviceTaskAttrs.getAttrName());
            customProperty.setName(serviceTaskAttrs.getAttrName());
            customProperty.setSimpleValue(attributeValue);
            customProperties.add(customProperty);
        }
      }
      serviceTask.setCustomProperties(customProperties);
      // 省略一些代码
      return serviceTask;
   }

}

部署转化bpmn的时候需要添加自定义的转化类BpmnXMLConverter.addConverter(new CustomServiceTaskXMLConverter());

监听类:

public class ServiceTaskAuto implements JavaDelegate {
   /**
   * 这里是每个自定义属性的字段名
   */
   private FixedValue action;

   @Override
   public void execute(DelegateExecution execution) {
     // 根据业务完成自己的校验动作
     // 如果成功,设置流程属性,失败的话,设置失败的属性,让流程走向失败的节点
   }
}

提交流程到了这个节点可以看到获取到的参数为:


ServiceTask自定义属性_第2张图片
流程执行参数

问题

  • com...interceptor.listener.ServiceTaskAuto org.activiti.engine.ActivitiIllegalArgumentException: Field definition uses unexisting field 'action' on class com...interceptor.listener.ServiceTaskAuto

    这个是因为在监听器里接收的方式不对,我们的自定义属性都需要通过FixedValue来接收,并且我们设置的所有属性值,都必须在这边有接收的属性,一开始是采用下面的方式接收的,就会报这个错。

    private Expression attrs;
    
    @Override
    public void execute(DelegateExecution execution) {
        
    }
    

未竟之事

  • http当成一个策略,不止http调用外部,可以是mq发送
  • 节点的校验,做的比较粗糙,还没有对一些属性进行校验
  • 重试?接口调用在实现类重试还是serviceTask的重试

你可能感兴趣的:(ServiceTask自定义属性)