Engine CDI Integration
Quarkus comes with a built-in solution for CDI (short for “Context and Dependency Injection”) called ArC, which is based on the Java CDI 2.0 standard. Quarkus ArC does not entirely cover the CDI 2.0 standard but only implements a subset of it.
The Camunda Engine offers CDI integration with the camunda-engine-cdi
module. This module is integrated
directly into the Quarkus Extension. You can learn more about the features and the programming model
at CDI and Java EE Integration.
Limitations
Since Quarkus ArC does not aim to implement CDI 2.0 fully, you cannot use the full range of features
the camunda-engine-cdi
module provides. Some features documented under
CDI and Java EE Integration are unsupported or only work with restrictions.
The limitations and differences are explained in more detail below.
Heads-up!
Quarkus ArC has more limitations not described in this section, as only those restrictions are highlighted
that affect the functionality of the camunda-engine-cdi
module. For your individual application development,
we highly recommend you consider the limitations and
supported features of the Quarkus version you are using.
Limited support of JUEL Expression Resolution
The camunda-engine-cdi
module allows referencing CDI beans and calling methods on CDI beans in
model expression properties (e.g., camunda:expression
, camunda:delegateExpression
, etc.).
Quarkus ArC currently doesn’t support the CDI API method javax.enterprise.inject.spi.BeanManager#getELResolver
,
which the engine uses to resolve method calls on CDI beans. This is why currently, only referencing
CDI beans is supported.
Examples:
- Supported Expression:
${myService}
- Unsupported Expression:
${myService.checkCondition('foo')}
Limited support of scopes in the Contextual Programming Model
While the camunda-engine-cdi
module supports associating a process instance with
Conversational Scope or Request Scope, Quarkus ArC
only supports the Request Scope.
Configure Quarkus to allow setting variables when a @StartProcess
annotated method is called
The camunda-engine-cdi
module allows setting variables when assigning a value to a class field
annotated with @ProcessVariableTyped
or @ProcessVariable
inside a method annotated
with @StartProcess
, as shown in the following example:
@Dependent
public class ProcessController {
@ProcessVariable
String myProcessVariable;
@StartProcess("keyOfTheProcess")
public void startProcessByKey() {
myProcessVariable = "my-value";
}
}
Since Quarkus tries to auto-inject beans into class fields annotated with @Qualifier
annotations,
the behavior, as shown above, doesn’t work out of the box. Instead, an exception is thrown.
However, if you know what you do and can spare the auto-inject behavior, it is possible to disable it. Read more about it in the ArC Configuration Reference.
Alternatively, you can set variables within a @StartProcess
annotated method programmatically:
@Dependent
public class ProcessController {
String myProcessVariable;
@StartProcess("keyOfTheProcess")
public void startProcessByKey() {
myProcessVariable = "my-value";
process.setVariable("myProcessVariable", myProcessVariable);
}
}
@BusinessProcessScoped
Beans
The camunda-engine-cdi
module stores @BusinessProcessScoped
beans as
process variables in the context of the current process instance.
Passivation is unsupported
Quarkus does not support Passivation and passivating scopes.
When using @BusinessProcessScoped
beans, no validation of being serializable and therefore
“Passivation Capable” is performed during the startup of the Quarkus application.
If your @BusinessProcessScoped
beans and their references
don’t implement the java.io.Serializable
interface, the engine throws an exception during execution
when trying to persist the beans as process variables.
Destroying Bean Instances is unsupported
Programmatically destroying a @BusinessProcessScoped
bean instance is
currently unsupported.
The following API methods will throw an UnsupportedOperationException
:
javax.enterprise.inject.Instance#destroy
io.quarkus.arc.InjectableContext#getState
io.quarkus.arc.InjectableContext#destroy
io.quarkus.arc.InjectableContext#destroy(Contextual<?> contextual)