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. В итоге разрешение выражений работает следующим образом:
-
Разделяемый процессный движок определяет, какому процессному приложению соответствует выполняемый в данный момент процесс.
-
Затем он делегирует этому процессному приложению задачу разрешения выражений.
-
Процессное приложение делегирует вызов в
SpringProcessApplicationElResolver, который использует локальный Spring application context для разрешения бинов.
|
Класс |
Использование 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