0

我们正在设置一个可流动的应用程序,以使用多个 bpmns 和可重用的 java 委托。在 application.yml 中,我们为每个 bpmn 设置了属性

例如

app1.mail.active:真

app2.mail.active:假

ApplicationProperties 文件使用 @ConfigurationProperties() 设置以获取属性。

创建了一个 Spring bean:

@Bean("applicationProperties")
public ApplicationProperties applicationProperties(){
    return new ApplicationProperties();
}

我正在尝试使用 groovy 使用脚本任务并初始化适当的属性。脚本中似乎没有 Spring bean。

<scriptTask id="sid-C8B8BE3F-F6CB-4559-B48C-5BC14AB76494" name="Initialize Process" scriptFormat="groovy">
    <script><![CDATA[
       // I want to be able to access applicationProperties bean here
         def _properties = applicationProperties.getApp1()
         execution.setVariable("properties", _properties)
   ]]></script>
</scriptTask>

在为 app1 初始化 bpmn 时,我想为与 app1 相关且类似于 app2 的属性设置一个变量。我可以在同一个 bpmn 的其他地方使用现有的 spring bean,但不能在 groovy 脚本任务中使用。

先感谢您。

4

2 回答 2

0

您可以切换到 SecureJavaScript 并将 bean 添加到自定义配置中的受信任 bean。

<dependency>
       <groupId>org.flowable</groupId>
       <artifactId>flowable-secure-javascript</artifactId>
       <version>6.6.0</version>
</dependency>

@Bean
public SecureJavascriptConfigurator secureJavascriptConfigurator() {
    SecureJavascriptConfigurator configurator =
        new SecureJavascriptConfigurator()
            .setMaxStackDepth(10)
            .setMaxScriptExecutionTime(3000L)
            .setMaxMemoryUsed(3145728L)
            .setNrOfInstructionsBeforeStateCheckCallback(10)
            .setEnableAccessToBeans(true);
    
    return configurator;
}

@Bean
@ConditionalOnClass(SpringProcessEngineConfiguration.class)
public EngineConfigurationConfigurer<SpringProcessEngineConfiguration> customProcessEngineConfigurer() {        
    return configuration -> {            
        configuration.addConfigurator(secureJavascriptConfigurator());
        Map<Object, Object> beans = new HashMap<>();
        beans.put("applicationProperties", applicationProperties);
        configuration.setBeans(beans);
    };
}
于 2021-06-15T14:27:04.090 回答
0

我想出的解决方案是使用 java 委托创建一个服务任务,以基于 bpmn 实例初始化应用程序属性和公共变量并设置一个属性变量,然后作为同一服务任务的一部分,我添加了一个 executionListener 来设置变量特定于该实例,使用 groovy 脚本。

<serviceTask id="initProcess" name="Init Process" flowable:delegateExpression="${initProcessDelegate}">
   <extensionElements>
      <flowable:executionListener event="end" class="org.flowable.engine.impl.bpmn.listener.ScriptExecutionListener">
          <flowable:field name="script">
            <flowable:string><![CDATA[

               import config.ApplicationProperties;
               ApplicationProperties.Props props = (ApplicationProperties.Props) execution.getVariable("properties");
               System.out.println("properties " + properties.getUrl()); 

          ]]></flowable:string>
          </flowable:field>
          <flowable:field name="language">
            <flowable:string><![CDATA[groovy]]></flowable:string>
          </flowable:field>
     </flowable:executionListener>
   </extensionElements>
</serviceTask>


public class ProcessInitDelegate implements JavaDelegate {

    Logger log = LoggerFactory.getLogger(getClass());

    @Autowired
    ApplicationProperties applicationProperties;

    public void execute(DelegateExecution execution) {
        log.info("<--------------- ProcessInitDelegate ------------->");
         try {
            // set up properties for current instance
            String instance = (String) execution.getVariable("processInstance");
            Object properties = applicationProperties.getInnerInstance(instance);
            if (instance.equals("<your_instance_name>")) {
              ApplicationProperties.Props instanceProperties = (ApplicationProperties.Props) properties;
              execution.setVariable("properties, instanceProperties);
            }
         } catch (Exception e) {
           log.error("Error setting up process {} ", e.getMessage());
         }
    }
}
于 2020-06-01T13:22:29.917 回答