Spring-бины в процессах

Этот раздел перенесён из документации Camunda 7 и в дальнейшем будет доработан с учётом особенностей OpenBPM Engine

Ограничение набора доступных Spring-бинов

При использовании ProcessEngineFactoryBean по умолчанию все выражения и скрипты в BPMN-процессах "видят" все Spring-бины. Однако можно ограничить набор бинов, которые вы хотите открыть, или вообще не открывать ни одного, используя настраиваемую map. В примере ниже открыт только один бин (printer), доступный по ключу printer. Чтобы не открывать ни одного бина, передайте пустую map в свойство beans у SpringProcessEngineConfiguration. Если свойство beans не задано, будут доступны все Spring-бины из контекста.

<bean id="processEngineConfiguration"
      class="io.openbpm.bpm.engine.spring.SpringProcessEngineConfiguration">
  ...
  <property name="beans">
    <map>
      <entry key="printer" value-ref="printer" />
    </map>
  </property>
</bean>

<bean id="printer"
      class="io.openbpm.bpm.engine.spring.test.transaction.Printer" />

Использование Spring-бинов в выражениях

Открытые бины можно использовать в выражениях. Например, SpringTransactionIntegrationTest в файле testBasicActivitiSpringIntegration.bpmn20.xml показывает, как можно вызвать метод Spring-бина через UEL method expression:

<definitions id="definitions" ...>

  <process id="helloProcess" isExecutable="true">

    <startEvent id="start" />
    <sequenceFlow id="flow1" sourceRef="start" targetRef="print" />

    <serviceTask id="print"
                 camunda:expression="#{printer.printMessage(execution)}" />
    <sequenceFlow id="flow2" sourceRef="print" targetRef="userTask" />

    <userTask id="userTask" />
    <sequenceFlow id="flow3" sourceRef="userTask" targetRef="end" />

    <endEvent id="end" />

  </process>

</definitions>

Класс Printer выглядит так:

public class Printer {

  public void printMessage(ActivityExecution execution) {
    execution.setVariable("myVar", "Hello from Printer!");
  }
}

А конфигурация Spring-бина, показанная выше, выглядит так:

<beans ...>
  ...

  <bean id="printer"
        class="io.openbpm.bpm.engine.spring.test.transaction.Printer" />
</beans>

Разрешение выражений в разделяемом процессном движке

В сценарии deployment с разделяемым процессным движком у вас есть один процессный движок, который диспетчеризует выполнение в несколько приложений. В этом случае нет единого Spring application context: каждое приложение может поддерживать собственный контекст. Процессный движок не может использовать один expression resolver для одного application context, поэтому он должен делегировать разрешение выражений соответствующему процессному приложению в зависимости от того, какой процесс сейчас выполняется.

Эта функциональность обеспечивается классом io.openbpm.bpm.engine.spring.application.SpringProcessApplicationElResolver. Это реализация ProcessApplicationElResolver, которая делегирует разрешение локальному application context. В итоге разрешение выражений работает следующим образом:

  1. Разделяемый процессный движок определяет, какому процессному приложению соответствует выполняемый в данный момент процесс.

  2. Затем он делегирует этому процессному приложению задачу разрешения выражений.

  3. Процессное приложение делегирует вызов в SpringProcessApplicationElResolver, который использует локальный Spring application context для разрешения бинов.

Класс SpringProcessApplicationElResolver автоматически обнаруживается, если модуль openbpm-engine-spring подключён как библиотека процессного приложения, а не как глобальная библиотека.

Использование Spring-бинов в скриптах

При использовании ProcessEngineFactoryBean все Spring-бины доступны в Groovy, JavaScript и Jython. Например, ScriptTaskTest-applicationContext.xml открывает бин testbean:

<beans ...>
  ...

  <bean id="testbean"
        class="io.openbpm.bpm.engine.spring.test.scripttask.Testbean" />
</beans>

Класс Testbean выглядит так:

@Component
public class Testbean {
  private String name = "name property of testbean";

  public String getName() {
    return name;
  }
}

Далее Testbean используется из JavaScript:

  execution.setVariable('foo', testbean.name);

Лицензия и атрибуция

Эта документация была создана на базе материала "Camunda 7 Docs" от Camunda, находится под лицензией Creative Commons Attribution-ShareAlike 3.0 Unported License .

Оригинал документации: https://docs.camunda.org