This is an automated email from the ASF dual-hosted git repository.
pefernan pushed a commit to branch main
in repository
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-runtimes.git
The following commit(s) were added to refs/heads/main by this push:
new cd2d4ff887 [incubator-kie-issues#2009] Process Instance in `error`
state after completing user task has wrong `nodeInstanceIdInError`. (#3965)
cd2d4ff887 is described below
commit cd2d4ff887f5b5a9b030c9264ac58c47e21661b9
Author: Pere Fernández <[email protected]>
AuthorDate: Fri Jul 4 13:10:39 2025 +0200
[incubator-kie-issues#2009] Process Instance in `error` state after
completing user task has wrong `nodeInstanceIdInError`. (#3965)
* [incubator-kie-issues#2009] Process Instance in `error` state after
completing user task has wrong `nodeInstanceIdInError`.
* - cancelling node instances in error after retriggering the process
instance
- improved NodeInstanceImpl exception capturing to avoid duplicated
wrappings
- improved logging
* - Add check to prevent NPE
* - Add IT Test
- fix typo
* - rat exclusion
* - fix imports order
* - code review
---
.rat-excludes | 4 +
.../workflow/instance/impl/NodeInstanceImpl.java | 35 +++-
.../process/impl/AbstractProcessInstance.java | 16 +-
.../src/main/resources/transactional_error.bpmn | 221 +++++++++++++++++++++
.../kogito/it/TransactionalErrorHandlingTest.java | 158 +++++++++++++++
.../it/JDBCTransactionalErrorHandlingIT.java} | 14 +-
.../PostgreSQLTransactionalErrorHandlingIT.java} | 10 +-
.../kie/kogito/integrationtests/HelloService.java | 2 +-
.../{excetpion => exception}/ServiceException.java | 2 +-
.../src/main/resources/saga-error-handling.bpmn2 | 4 +-
.../it/JDBCTransactionalErrorHandlingIT.java | 13 +-
.../src/main/resources/transactional_error.bpmn | 221 +++++++++++++++++++++
.../kogito/it/TransactionalErrorHandlingTest.java | 172 ++++++++++++++++
.../it/PostgreSQLTransactionalErrorHandlingIT.java | 13 +-
14 files changed, 848 insertions(+), 37 deletions(-)
diff --git a/.rat-excludes b/.rat-excludes
index d6c2515214..13e313bd27 100644
--- a/.rat-excludes
+++ b/.rat-excludes
@@ -164,6 +164,8 @@ PMMLTree.pmml
PMMLRegression.pmml
#
quarkus/integration-tests/integration-tests-quarkus-rules/src/test/resources/LoanUnit.xls.properties.test
LoanUnit.xls.properties.test
+#
quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-processes-persistence-common/src/main/resources/transactional_error.bpmn
+transactional_error.bpmn
# springboot/addons/events/decisions/src/main/resources/META-INF/kogito.addon
kogito.addon
# springboot/addons/events/predictions/src/main/resources/META-INF/kogito.addon
@@ -216,3 +218,5 @@ PMMLRegression.pmml
.gitignore
#
springboot/integration-tests/integration-tests-springboot-processes-persistence-it/integration-tests-springboot-processes-persistence-common/.gitignore
.gitignore
+#
springboot/integration-tests/integration-tests-springboot-processes-persistence-it/integration-tests-springboot-processes-persistence-common/src/main/resources/transactional_error.bpmn
+transactional_error.bpmn
\ No newline at end of file
diff --git
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/NodeInstanceImpl.java
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/NodeInstanceImpl.java
index 95dd62b8a7..61a59d6ac7 100755
---
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/NodeInstanceImpl.java
+++
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/NodeInstanceImpl.java
@@ -250,22 +250,35 @@ public abstract class NodeInstanceImpl implements
org.jbpm.workflow.instance.Nod
((InternalProcessRuntime) kruntime.getProcessRuntime())
.getProcessEventSupport().fireBeforeNodeTriggered(this,
kruntime);
}
+
+ captureExecutionException(() -> internalTrigger(from, type));
+
+ if (!hidden) {
+ ((InternalProcessRuntime) kruntime.getProcessRuntime())
+ .getProcessEventSupport().fireAfterNodeTriggered(this,
kruntime);
+ }
+ }
+
+ protected void captureExecutionException(Runnable runnable) {
try {
- internalTrigger(from, type);
+ runnable.run();
} catch (Exception e) {
if
(!WORKFLOW_PARAM_TRANSACTIONS.get(getProcessInstance().getProcess())) {
- logger.error("Node instance causing process instance error in
id {} in a non transactional environment", this.getStringId());
+ logger.error("Error executing node instance '{}' (node '{}'
id: '{}') in process instance '{}' (process: '{}') in a non transactional
environment ", getStringId(), getNodeName(),
+ getNodeDefinitionId(), processInstance.getId(),
processInstance.getProcessId());
captureError(e);
- return;
} else {
- logger.error("Node instance causing process instance error in
id {} in a transactional environment (Wrapping)", this.getStringId());
+ // Checking if the exception has been already wrapped by the
actual node instance to avoid unnecessary wrappings.
+ if (e instanceof ProcessInstanceExecutionException
executionException &&
getId().equals(executionException.getFailedNodeInstanceId())) {
+ logger.debug("Exception already wrapped by node instance
'{}' (node '{}' id: '{}') in process instance '{}' (process: '{}')...
propagating exception.", getStringId(),
+ getNodeName(),
+ getNodeDefinitionId(), processInstance.getId(),
processInstance.getProcessId());
+ throw executionException;
+ }
+ logger.error("Error executing node instance '{}' (node '{}'
id: '{}') in process instance '{}' (process: '{}') in a transactional
environment (Wrapping)", getStringId(), getNodeName(),
+ getNodeDefinitionId(), processInstance.getId(),
processInstance.getProcessId());
throw new
ProcessInstanceExecutionException(this.getProcessInstance().getId(),
this.getNodeDefinitionId(), this.getId(), e.getMessage(), e);
}
- // stop after capturing error
- }
- if (!hidden) {
- ((InternalProcessRuntime) kruntime.getProcessRuntime())
- .getProcessEventSupport().fireAfterNodeTriggered(this,
kruntime);
}
}
@@ -465,8 +478,10 @@ public abstract class NodeInstanceImpl implements
org.jbpm.workflow.instance.Nod
((InternalProcessRuntime) kruntime.getProcessRuntime())
.getProcessEventSupport().fireBeforeNodeLeft(this,
kruntime);
}
+
// trigger next node
- nodeInstance.trigger(this, type);
+ captureExecutionException(() -> nodeInstance.trigger(this, type));
+
Collection<Connection> outgoing =
getNode().getOutgoingConnections(type);
for (Connection conn : outgoing) {
if (conn.getTo().getId().equals(nodeInstance.getNodeId())) {
diff --git
a/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/AbstractProcessInstance.java
b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/AbstractProcessInstance.java
index edfff66d24..37c5d5b6b9 100644
---
a/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/AbstractProcessInstance.java
+++
b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/AbstractProcessInstance.java
@@ -98,7 +98,7 @@ public abstract class AbstractProcessInstance<T extends
Model> implements Proces
protected String errorMessage;
protected String nodeInError;
- protected String nodeInstanceInError;
+ protected String nodeInstanceIdInError;
protected Throwable errorCause;
protected ProcessError processError;
@@ -172,7 +172,7 @@ public abstract class AbstractProcessInstance<T extends
Model> implements Proces
startDate = wpi.getStartDate();
errorMessage = wpi.getErrorMessage();
nodeInError = wpi.getNodeIdInError();
- nodeInstanceInError = wpi.getNodeInstanceIdInError();
+ nodeInstanceIdInError = wpi.getNodeInstanceIdInError();
errorCause = wpi.getErrorCause().orElse(null);
if (this.status == STATE_ERROR) {
@@ -835,7 +835,7 @@ public abstract class AbstractProcessInstance<T extends
Model> implements Proces
@Override
public String failedNodeInstanceId() {
- return nodeInstanceInError;
+ return nodeInstanceIdInError;
}
@Override
@@ -851,13 +851,23 @@ public abstract class AbstractProcessInstance<T extends
Model> implements Proces
@Override
public void retrigger() {
executeInWorkflowProcessInstanceWrite(pi -> {
+ NodeInstance nodeInstanceInError =
pi.getNodeInstance(nodeInstanceIdInError, true);
NodeInstanceImpl ni = (NodeInstanceImpl)
pi.getByNodeDefinitionId(nodeInError, pi.getNodeContainer());
+
clearError(pi);
+
getProcessRuntime().getProcessEventSupport().fireProcessRetriggered(pi,
pi.getKnowledgeRuntime());
org.kie.api.runtime.process.NodeInstanceContainer
nodeInstanceContainer = ni.getNodeInstanceContainer();
if (nodeInstanceContainer instanceof NodeInstance) {
((NodeInstance)
nodeInstanceContainer).internalSetTriggerTime(new Date());
}
+
+ if (nodeInstanceInError != null &&
nodeInstanceInError.getLeaveTime() == null &&
nodeInstanceInError.getCancelType() == null) {
+ // Cancelling the node instance in error before
retriggering if it is active to avoid duplicated node instances.
+ // This is required when dealing with work items (ej:
Human Tasks)
+ nodeInstanceInError.cancel();
+ }
+
ni.internalSetRetrigger(true);
ni.trigger(null, Node.CONNECTION_DEFAULT_TYPE);
return null;
diff --git
a/quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-processes-persistence-common/src/main/resources/transactional_error.bpmn
b/quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-processes-persistence-common/src/main/resources/transactional_error.bpmn
new file mode 100644
index 0000000000..1635991af1
--- /dev/null
+++
b/quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-processes-persistence-common/src/main/resources/transactional_error.bpmn
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:bpsim="http://www.bpsim.org/schemas/1.0"
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
xmlns:drools="http://www.jboss.org/drools" id="_HxRxkDlJED6vKMe2WKzD0Q"
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd
http://www. [...]
+ <bpmn2:itemDefinition id="_failItem" structureRef="Boolean"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_SkippableInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_PriorityInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_CommentInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_DescriptionInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_CreatedByInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_TaskNameInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_GroupIdInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_ContentInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_NotStartedReassignInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_NotCompletedReassignInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_NotStartedNotifyInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_NotCompletedNotifyInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_failInputXItem"
structureRef="Boolean"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_failOutputXItem"
structureRef="Boolean"/>
+ <bpmn2:collaboration id="_6CAC7A4D-3A99-48DE-9CB4-FE788E60AEDB"
name="Default Collaboration">
+ <bpmn2:participant id="_CC69D1E8-AB63-42F1-A038-911BEF77413F" name="Pool
Participant" processRef="transactional_errors"/>
+ </bpmn2:collaboration>
+ <bpmn2:process id="transactional_errors" drools:packageName="org.kie.kogito"
drools:version="1.0" drools:adHoc="false" name="transactional_errors"
isExecutable="true" processType="Public">
+ <bpmn2:property id="fail" itemSubjectRef="_failItem" name="fail"/>
+ <bpmn2:sequenceFlow id="_47D94ED0-DBD0-40BF-A8BE-D9CBE9B33611"
sourceRef="_E691E0BE-B728-4369-867D-AACC71812F87"
targetRef="_9413B17A-F1C9-444F-978D-63EFA8CD4801"/>
+ <bpmn2:sequenceFlow id="_75CD85AE-40AB-4D88-BF39-C22CA61DEAC9"
sourceRef="_530D47D5-4BE7-4E54-8F12-C225CB9B3529"
targetRef="_F44C0F61-F897-4D8F-884A-AEBFF906E5FD"/>
+ <bpmn2:sequenceFlow id="_20A1FF12-D2BF-4522-A23A-724F925A7584"
sourceRef="_9413B17A-F1C9-444F-978D-63EFA8CD4801"
targetRef="_530D47D5-4BE7-4E54-8F12-C225CB9B3529"/>
+ <bpmn2:sequenceFlow id="_4A571422-CE8A-4BAD-8D3B-CAD5F9DE07A7"
sourceRef="_48F366CD-9D0F-4E92-AA59-1638DCD5933B"
targetRef="_E691E0BE-B728-4369-867D-AACC71812F87"/>
+ <bpmn2:scriptTask id="_9413B17A-F1C9-444F-978D-63EFA8CD4801"
name="ScriptTask 1" scriptFormat="http://www.java.com/java">
+ <bpmn2:extensionElements>
+ <drools:metaData name="elementname">
+ <drools:metaValue><![CDATA[ScriptTask 1]]></drools:metaValue>
+ </drools:metaData>
+ </bpmn2:extensionElements>
+ <bpmn2:incoming>_47D94ED0-DBD0-40BF-A8BE-D9CBE9B33611</bpmn2:incoming>
+ <bpmn2:outgoing>_20A1FF12-D2BF-4522-A23A-724F925A7584</bpmn2:outgoing>
+ <bpmn2:script>System.out.println("This is a previous task to see if we
catch the error in this node");</bpmn2:script>
+ </bpmn2:scriptTask>
+ <bpmn2:userTask id="_E691E0BE-B728-4369-867D-AACC71812F87" name="Before">
+ <bpmn2:extensionElements>
+ <drools:metaData name="elementname">
+ <drools:metaValue><![CDATA[Before]]></drools:metaValue>
+ </drools:metaData>
+ </bpmn2:extensionElements>
+ <bpmn2:incoming>_4A571422-CE8A-4BAD-8D3B-CAD5F9DE07A7</bpmn2:incoming>
+ <bpmn2:outgoing>_47D94ED0-DBD0-40BF-A8BE-D9CBE9B33611</bpmn2:outgoing>
+ <bpmn2:ioSpecification>
+ <bpmn2:dataInput
id="_E691E0BE-B728-4369-867D-AACC71812F87_TaskNameInputX" drools:dtype="Object"
itemSubjectRef="__E691E0BE-B728-4369-867D-AACC71812F87_TaskNameInputXItem"
name="TaskName"/>
+ <bpmn2:dataInput id="_E691E0BE-B728-4369-867D-AACC71812F87_failInputX"
drools:dtype="Boolean"
itemSubjectRef="__E691E0BE-B728-4369-867D-AACC71812F87_failInputXItem"
name="fail"/>
+ <bpmn2:dataInput
id="_E691E0BE-B728-4369-867D-AACC71812F87_SkippableInputX"
drools:dtype="Object"
itemSubjectRef="__E691E0BE-B728-4369-867D-AACC71812F87_SkippableInputXItem"
name="Skippable"/>
+ <bpmn2:dataOutput
id="_E691E0BE-B728-4369-867D-AACC71812F87_failOutputX" drools:dtype="Boolean"
itemSubjectRef="__E691E0BE-B728-4369-867D-AACC71812F87_failOutputXItem"
name="fail"/>
+ <bpmn2:inputSet>
+
<bpmn2:dataInputRefs>_E691E0BE-B728-4369-867D-AACC71812F87_TaskNameInputX</bpmn2:dataInputRefs>
+
<bpmn2:dataInputRefs>_E691E0BE-B728-4369-867D-AACC71812F87_failInputX</bpmn2:dataInputRefs>
+
<bpmn2:dataInputRefs>_E691E0BE-B728-4369-867D-AACC71812F87_SkippableInputX</bpmn2:dataInputRefs>
+ </bpmn2:inputSet>
+ <bpmn2:outputSet>
+
<bpmn2:dataOutputRefs>_E691E0BE-B728-4369-867D-AACC71812F87_failOutputX</bpmn2:dataOutputRefs>
+ </bpmn2:outputSet>
+ </bpmn2:ioSpecification>
+ <bpmn2:dataInputAssociation>
+
<bpmn2:targetRef>_E691E0BE-B728-4369-867D-AACC71812F87_TaskNameInputX</bpmn2:targetRef>
+ <bpmn2:assignment>
+ <bpmn2:from
xsi:type="bpmn2:tFormalExpression"><![CDATA[Before]]></bpmn2:from>
+ <bpmn2:to
xsi:type="bpmn2:tFormalExpression"><![CDATA[_E691E0BE-B728-4369-867D-AACC71812F87_TaskNameInputX]]></bpmn2:to>
+ </bpmn2:assignment>
+ </bpmn2:dataInputAssociation>
+ <bpmn2:dataInputAssociation>
+ <bpmn2:sourceRef>fail</bpmn2:sourceRef>
+
<bpmn2:targetRef>_E691E0BE-B728-4369-867D-AACC71812F87_failInputX</bpmn2:targetRef>
+ </bpmn2:dataInputAssociation>
+ <bpmn2:dataInputAssociation>
+
<bpmn2:targetRef>_E691E0BE-B728-4369-867D-AACC71812F87_SkippableInputX</bpmn2:targetRef>
+ <bpmn2:assignment>
+ <bpmn2:from
xsi:type="bpmn2:tFormalExpression"><![CDATA[false]]></bpmn2:from>
+ <bpmn2:to
xsi:type="bpmn2:tFormalExpression"><![CDATA[_E691E0BE-B728-4369-867D-AACC71812F87_SkippableInputX]]></bpmn2:to>
+ </bpmn2:assignment>
+ </bpmn2:dataInputAssociation>
+ <bpmn2:dataOutputAssociation>
+
<bpmn2:sourceRef>_E691E0BE-B728-4369-867D-AACC71812F87_failOutputX</bpmn2:sourceRef>
+ <bpmn2:targetRef>fail</bpmn2:targetRef>
+ </bpmn2:dataOutputAssociation>
+ <bpmn2:potentialOwner id="_HxTmwDlJED6vKMe2WKzD0Q">
+ <bpmn2:resourceAssignmentExpression id="_HxTmwTlJED6vKMe2WKzD0Q">
+ <bpmn2:formalExpression>jdoe</bpmn2:formalExpression>
+ </bpmn2:resourceAssignmentExpression>
+ </bpmn2:potentialOwner>
+ </bpmn2:userTask>
+ <bpmn2:endEvent id="_F44C0F61-F897-4D8F-884A-AEBFF906E5FD">
+ <bpmn2:incoming>_75CD85AE-40AB-4D88-BF39-C22CA61DEAC9</bpmn2:incoming>
+ </bpmn2:endEvent>
+ <bpmn2:scriptTask id="_530D47D5-4BE7-4E54-8F12-C225CB9B3529" name="It may
fail" scriptFormat="http://www.java.com/java">
+ <bpmn2:extensionElements>
+ <drools:metaData name="elementname">
+ <drools:metaValue><![CDATA[It may fail]]></drools:metaValue>
+ </drools:metaData>
+ </bpmn2:extensionElements>
+ <bpmn2:incoming>_20A1FF12-D2BF-4522-A23A-724F925A7584</bpmn2:incoming>
+ <bpmn2:outgoing>_75CD85AE-40AB-4D88-BF39-C22CA61DEAC9</bpmn2:outgoing>
+ <bpmn2:script>if(fail) {
+ throw new java.lang.RuntimeException("This is a controlled error... fail
-> true");
+}
+
+System.out.println("Congratulations there's not error!");</bpmn2:script>
+ </bpmn2:scriptTask>
+ <bpmn2:startEvent id="_48F366CD-9D0F-4E92-AA59-1638DCD5933B">
+ <bpmn2:outgoing>_4A571422-CE8A-4BAD-8D3B-CAD5F9DE07A7</bpmn2:outgoing>
+ </bpmn2:startEvent>
+ </bpmn2:process>
+ <bpmndi:BPMNDiagram>
+ <bpmndi:BPMNPlane bpmnElement="transactional_errors">
+ <bpmndi:BPMNShape id="shape__48F366CD-9D0F-4E92-AA59-1638DCD5933B"
bpmnElement="_48F366CD-9D0F-4E92-AA59-1638DCD5933B">
+ <dc:Bounds height="56" width="56" x="104" y="131"/>
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNShape id="shape__530D47D5-4BE7-4E54-8F12-C225CB9B3529"
bpmnElement="_530D47D5-4BE7-4E54-8F12-C225CB9B3529">
+ <dc:Bounds height="102" width="154" x="684" y="108"/>
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNShape id="shape__F44C0F61-F897-4D8F-884A-AEBFF906E5FD"
bpmnElement="_F44C0F61-F897-4D8F-884A-AEBFF906E5FD">
+ <dc:Bounds height="56" width="56" x="918" y="131"/>
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNShape id="shape__E691E0BE-B728-4369-867D-AACC71812F87"
bpmnElement="_E691E0BE-B728-4369-867D-AACC71812F87">
+ <dc:Bounds height="102" width="154" x="216" y="108"/>
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNShape id="shape__9413B17A-F1C9-444F-978D-63EFA8CD4801"
bpmnElement="_9413B17A-F1C9-444F-978D-63EFA8CD4801">
+ <dc:Bounds height="102" width="154" x="450" y="108"/>
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNEdge
id="edge_shape__48F366CD-9D0F-4E92-AA59-1638DCD5933B_to_shape__E691E0BE-B728-4369-867D-AACC71812F87"
bpmnElement="_4A571422-CE8A-4BAD-8D3B-CAD5F9DE07A7">
+ <di:waypoint x="132" y="159"/>
+ <di:waypoint x="293" y="159"/>
+ </bpmndi:BPMNEdge>
+ <bpmndi:BPMNEdge
id="edge_shape__9413B17A-F1C9-444F-978D-63EFA8CD4801_to_shape__530D47D5-4BE7-4E54-8F12-C225CB9B3529"
bpmnElement="_20A1FF12-D2BF-4522-A23A-724F925A7584">
+ <di:waypoint x="527" y="159"/>
+ <di:waypoint x="684" y="159"/>
+ </bpmndi:BPMNEdge>
+ <bpmndi:BPMNEdge
id="edge_shape__530D47D5-4BE7-4E54-8F12-C225CB9B3529_to_shape__F44C0F61-F897-4D8F-884A-AEBFF906E5FD"
bpmnElement="_75CD85AE-40AB-4D88-BF39-C22CA61DEAC9">
+ <di:waypoint x="761" y="159"/>
+ <di:waypoint x="946" y="159"/>
+ </bpmndi:BPMNEdge>
+ <bpmndi:BPMNEdge
id="edge_shape__E691E0BE-B728-4369-867D-AACC71812F87_to_shape__9413B17A-F1C9-444F-978D-63EFA8CD4801"
bpmnElement="_47D94ED0-DBD0-40BF-A8BE-D9CBE9B33611">
+ <di:waypoint x="293" y="159"/>
+ <di:waypoint x="527" y="159"/>
+ </bpmndi:BPMNEdge>
+ </bpmndi:BPMNPlane>
+ </bpmndi:BPMNDiagram>
+ <bpmn2:relationship type="BPSimData">
+ <bpmn2:extensionElements>
+ <bpsim:BPSimData>
+ <bpsim:Scenario id="default" name="Simulationscenario">
+ <bpsim:ScenarioParameters/>
+ <bpsim:ElementParameters
elementRef="_48F366CD-9D0F-4E92-AA59-1638DCD5933B">
+ <bpsim:TimeParameters>
+ <bpsim:ProcessingTime>
+ <bpsim:NormalDistribution mean="0" standardDeviation="0"/>
+ </bpsim:ProcessingTime>
+ </bpsim:TimeParameters>
+ </bpsim:ElementParameters>
+ <bpsim:ElementParameters
elementRef="_530D47D5-4BE7-4E54-8F12-C225CB9B3529">
+ <bpsim:TimeParameters>
+ <bpsim:ProcessingTime>
+ <bpsim:NormalDistribution mean="0" standardDeviation="0"/>
+ </bpsim:ProcessingTime>
+ </bpsim:TimeParameters>
+ <bpsim:ResourceParameters>
+ <bpsim:Availability>
+ <bpsim:FloatingParameter value="0"/>
+ </bpsim:Availability>
+ <bpsim:Quantity>
+ <bpsim:FloatingParameter value="0"/>
+ </bpsim:Quantity>
+ </bpsim:ResourceParameters>
+ <bpsim:CostParameters>
+ <bpsim:UnitCost>
+ <bpsim:FloatingParameter value="0"/>
+ </bpsim:UnitCost>
+ </bpsim:CostParameters>
+ </bpsim:ElementParameters>
+ <bpsim:ElementParameters
elementRef="_E691E0BE-B728-4369-867D-AACC71812F87">
+ <bpsim:TimeParameters>
+ <bpsim:ProcessingTime>
+ <bpsim:NormalDistribution mean="0" standardDeviation="0"/>
+ </bpsim:ProcessingTime>
+ </bpsim:TimeParameters>
+ <bpsim:ResourceParameters>
+ <bpsim:Availability>
+ <bpsim:FloatingParameter value="0"/>
+ </bpsim:Availability>
+ <bpsim:Quantity>
+ <bpsim:FloatingParameter value="0"/>
+ </bpsim:Quantity>
+ </bpsim:ResourceParameters>
+ <bpsim:CostParameters>
+ <bpsim:UnitCost>
+ <bpsim:FloatingParameter value="0"/>
+ </bpsim:UnitCost>
+ </bpsim:CostParameters>
+ </bpsim:ElementParameters>
+ <bpsim:ElementParameters
elementRef="_9413B17A-F1C9-444F-978D-63EFA8CD4801">
+ <bpsim:TimeParameters>
+ <bpsim:ProcessingTime>
+ <bpsim:NormalDistribution mean="0" standardDeviation="0"/>
+ </bpsim:ProcessingTime>
+ </bpsim:TimeParameters>
+ <bpsim:ResourceParameters>
+ <bpsim:Availability>
+ <bpsim:FloatingParameter value="0"/>
+ </bpsim:Availability>
+ <bpsim:Quantity>
+ <bpsim:FloatingParameter value="0"/>
+ </bpsim:Quantity>
+ </bpsim:ResourceParameters>
+ <bpsim:CostParameters>
+ <bpsim:UnitCost>
+ <bpsim:FloatingParameter value="0"/>
+ </bpsim:UnitCost>
+ </bpsim:CostParameters>
+ </bpsim:ElementParameters>
+ </bpsim:Scenario>
+ </bpsim:BPSimData>
+ </bpmn2:extensionElements>
+ <bpmn2:source>_HxRxkDlJED6vKMe2WKzD0Q</bpmn2:source>
+ <bpmn2:target>_HxRxkDlJED6vKMe2WKzD0Q</bpmn2:target>
+ </bpmn2:relationship>
+</bpmn2:definitions>
\ No newline at end of file
diff --git
a/quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-processes-persistence-common/src/test/java/org/kie/kogito/it/TransactionalErrorHandlingTest.java
b/quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-processes-persistence-common/src/test/java/org/kie/kogito/it/TransactionalErrorHandlingTest.java
new file mode 100644
index 0000000000..42eeeef76c
--- /dev/null
+++
b/quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-processes-persistence-common/src/test/java/org/kie/kogito/it/TransactionalErrorHandlingTest.java
@@ -0,0 +1,158 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.kie.kogito.it;
+
+import java.util.Map;
+
+import org.junit.jupiter.api.Test;
+import org.kie.kogito.usertask.model.TransitionInfo;
+
+import io.restassured.RestAssured;
+import io.restassured.http.ContentType;
+
+import static io.restassured.RestAssured.given;
+import static org.hamcrest.CoreMatchers.*;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.emptyOrNullString;
+
+public abstract class TransactionalErrorHandlingTest {
+ private static final String USER_TASK_BASE_PATH = "/usertasks/instance";
+ private static final String MANAGEMENT_INSTANCE_PATH =
"/management/processes/{processId}/instances/{processInstanceId}";
+
+ private static final String ERRORS_PROCESS = "transactional_errors";
+
+ static {
+ RestAssured.enableLoggingOfRequestAndResponseIfValidationFails();
+ }
+
+ @Test
+ void testTransactionalErrorsProcess() {
+ String pId = given().contentType(ContentType.JSON)
+ .when()
+ .pathParam("processId", ERRORS_PROCESS)
+ .body(Map.of("fail", true))
+ .post("/{processId}")
+ .then()
+ .statusCode(201)
+ .body("id", not(emptyOrNullString()))
+ .extract()
+ .path("id");
+
+ String userTaskId = given()
+ .basePath(USER_TASK_BASE_PATH)
+ .queryParam("user", "jdoe")
+ .contentType(ContentType.JSON)
+ .when()
+ .get()
+ .then()
+ .statusCode(200)
+ .extract()
+ .body()
+ .path("[0].id");
+
+ given()
+ .contentType(ContentType.JSON)
+ .basePath(USER_TASK_BASE_PATH)
+ .queryParam("user", "jdoe")
+ .body(new TransitionInfo("complete", Map.of("fail", true)))
+ .when()
+ .post("/{userTaskId}/transition", userTaskId)
+ .then()
+ .statusCode(500);
+
+ given()
+ .contentType(ContentType.JSON)
+ .basePath(MANAGEMENT_INSTANCE_PATH)
+ .pathParam("processId", ERRORS_PROCESS)
+ .pathParam("processInstanceId", pId)
+ .when()
+ .get("error")
+ .then()
+ .statusCode(200)
+ .body("failedNodeId",
equalTo("_E691E0BE-B728-4369-867D-AACC71812F87"))
+ .body("id", equalTo(pId))
+ .body("message", containsString("java.lang.RuntimeException -
This is a controlled error... fail -> true"));
+
+ given()
+ .basePath(USER_TASK_BASE_PATH)
+ .queryParam("user", "jdoe")
+ .contentType(ContentType.JSON)
+ .when()
+ .get()
+ .then()
+ .statusCode(200)
+ .body("[0].id", equalTo(userTaskId));
+
+ given()
+ .contentType(ContentType.JSON)
+ .basePath(MANAGEMENT_INSTANCE_PATH)
+ .pathParam("processId", ERRORS_PROCESS)
+ .pathParam("processInstanceId", pId)
+ .when()
+ .post("retrigger")
+ .then()
+ .statusCode(200)
+ .body("id", equalTo(pId))
+ .body("fail", equalTo(true));
+
+ given()
+ .contentType(ContentType.JSON)
+ .basePath(MANAGEMENT_INSTANCE_PATH)
+ .pathParam("processId", ERRORS_PROCESS)
+ .pathParam("processInstanceId", pId)
+ .when()
+ .get("error")
+ .then()
+ .statusCode(400)
+ .body(equalTo("Process instance with id " + pId + " is not in
error state"));
+
+ userTaskId = given()
+ .basePath(USER_TASK_BASE_PATH)
+ .queryParam("user", "jdoe")
+ .contentType(ContentType.JSON)
+ .when()
+ .get()
+ .then()
+ .statusCode(200)
+ .body("[0].id", not(equalTo(userTaskId)))
+ .extract()
+ .body()
+ .path("[0].id");
+
+ given()
+ .contentType(ContentType.JSON)
+ .basePath(USER_TASK_BASE_PATH)
+ .queryParam("user", "jdoe")
+ .body(new TransitionInfo("complete", Map.of("fail", false)))
+ .when()
+ .post("/{userTaskId}/transition", userTaskId)
+ .then()
+ .statusCode(200);
+
+ given()
+ .accept(ContentType.JSON)
+ .when()
+ .pathParam("processId", ERRORS_PROCESS)
+ .get("/{processId}")
+ .then()
+ .statusCode(200)
+ .body("size()", is(0));
+ }
+}
diff --git
a/quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/excetpion/ServiceException.java
b/quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-quarkus-processes-jdbc/src/test/java/org/kie/kogito/it/JDBCTransactionalErrorHandlingIT.java
similarity index 68%
copy from
quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/excetpion/ServiceException.java
copy to
quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-quarkus-processes-jdbc/src/test/java/org/kie/kogito/it/JDBCTransactionalErrorHandlingIT.java
index f1b671e1c4..78985ec85c 100644
---
a/quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/excetpion/ServiceException.java
+++
b/quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-quarkus-processes-jdbc/src/test/java/org/kie/kogito/it/JDBCTransactionalErrorHandlingIT.java
@@ -16,11 +16,15 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.kie.kogito.integrationtests.excetpion;
-public class ServiceException extends RuntimeException {
+package org.kie.kogito.it;
- public ServiceException(String message) {
- super(message);
- }
+import org.kie.kogito.testcontainers.quarkus.PostgreSqlQuarkusTestResource;
+
+import io.quarkus.test.common.QuarkusTestResource;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
+
+@QuarkusIntegrationTest
+@QuarkusTestResource(PostgreSqlQuarkusTestResource.class)
+public class JDBCTransactionalErrorHandlingIT extends
TransactionalErrorHandlingTest {
}
diff --git
a/quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/excetpion/ServiceException.java
b/quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-quarkus-processes-postgresql/src/test/java/org/kie/kogito/it/PostgreSQLTransactionalErrorHandlingIT.java
similarity index 80%
copy from
quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/excetpion/ServiceException.java
copy to
quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-quarkus-processes-postgresql/src/test/java/org/kie/kogito/it/PostgreSQLTransactionalErrorHandlingIT.java
index f1b671e1c4..5d4167b543 100644
---
a/quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/excetpion/ServiceException.java
+++
b/quarkus/integration-tests/integration-tests-quarkus-processes-persistence/integration-tests-quarkus-processes-postgresql/src/test/java/org/kie/kogito/it/PostgreSQLTransactionalErrorHandlingIT.java
@@ -16,11 +16,11 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.kie.kogito.integrationtests.excetpion;
-public class ServiceException extends RuntimeException {
+package org.kie.kogito.it;
- public ServiceException(String message) {
- super(message);
- }
+import io.quarkus.test.junit.QuarkusIntegrationTest;
+
+@QuarkusIntegrationTest
+public class PostgreSQLTransactionalErrorHandlingIT extends
TransactionalErrorHandlingTest {
}
diff --git
a/quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/HelloService.java
b/quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/HelloService.java
index eca48adac1..e8f97644d1 100755
---
a/quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/HelloService.java
+++
b/quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/HelloService.java
@@ -20,7 +20,7 @@ package org.kie.kogito.integrationtests;
import java.io.IOException;
-import org.kie.kogito.integrationtests.excetpion.ServiceException;
+import org.kie.kogito.integrationtests.exception.ServiceException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git
a/quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/excetpion/ServiceException.java
b/quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/exception/ServiceException.java
similarity index 94%
copy from
quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/excetpion/ServiceException.java
copy to
quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/exception/ServiceException.java
index f1b671e1c4..72c75841ae 100644
---
a/quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/excetpion/ServiceException.java
+++
b/quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/exception/ServiceException.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.kie.kogito.integrationtests.excetpion;
+package org.kie.kogito.integrationtests.exception;
public class ServiceException extends RuntimeException {
diff --git
a/quarkus/integration-tests/integration-tests-quarkus-processes/src/main/resources/saga-error-handling.bpmn2
b/quarkus/integration-tests/integration-tests-quarkus-processes/src/main/resources/saga-error-handling.bpmn2
index 89df47591e..5a98b6ea4b 100644
---
a/quarkus/integration-tests/integration-tests-quarkus-processes/src/main/resources/saga-error-handling.bpmn2
+++
b/quarkus/integration-tests/integration-tests-quarkus-processes/src/main/resources/saga-error-handling.bpmn2
@@ -37,7 +37,7 @@
<bpmn2:interface id="_A4898FE5-A2BC-4D3C-90F2-7992CD7FB20C_ServiceInterface"
name="org.kie.kogito.integrationtests.HelloService"
implementationRef="org.kie.kogito.integrationtests.HelloService">
<bpmn2:operation
id="_A4898FE5-A2BC-4D3C-90F2-7992CD7FB20C_ServiceOperation" name="echo"
implementationRef="echo"/>
</bpmn2:interface>
- <bpmn2:error id="org.kie.kogito.integrationtests.excetpion.ServiceException"
errorCode="org.kie.kogito.integrationtests.excetpion.ServiceException"/>
+ <bpmn2:error id="org.kie.kogito.integrationtests.exception.ServiceException"
errorCode="org.kie.kogito.integrationtests.exception.ServiceException"/>
<bpmn2:interface id="_F12F8E21-9130-49C3-A73F-F3B0093104FB_ServiceInterface"
name="org.kie.kogito.integrationtests.HelloService"
implementationRef="org.kie.kogito.integrationtests.HelloService">
<bpmn2:operation
id="_F12F8E21-9130-49C3-A73F-F3B0093104FB_ServiceOperation" name="hello"
implementationRef="hello"/>
</bpmn2:interface>
@@ -263,7 +263,7 @@
</drools:metaData>
</bpmn2:extensionElements>
<bpmn2:outgoing>_D20C84EC-27D5-4FFD-B959-87DFF80B9AA1</bpmn2:outgoing>
- <bpmn2:errorEventDefinition
drools:erefname="org.kie.kogito.integrationtests.excetpion.ServiceException"
errorRef="org.kie.kogito.integrationtests.excetpion.ServiceException"/>
+ <bpmn2:errorEventDefinition
drools:erefname="org.kie.kogito.integrationtests.exception.ServiceException"
errorRef="org.kie.kogito.integrationtests.exception.ServiceException"/>
</bpmn2:startEvent>
<bpmn2:serviceTask id="_A4898FE5-A2BC-4D3C-90F2-7992CD7FB20C"
drools:serviceimplementation="Java"
drools:serviceinterface="org.kie.kogito.integrationtests.HelloService"
drools:serviceoperation="echo" name="Failed" implementation="Java"
operationRef="_A4898FE5-A2BC-4D3C-90F2-7992CD7FB20C_ServiceOperation">
<bpmn2:extensionElements>
diff --git
a/quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/excetpion/ServiceException.java
b/springboot/integration-tests/integration-tests-springboot-processes-persistence-it/integration-tests-springboot-processes-jdbc/src/test/java/org/kie/kogito/it/JDBCTransactionalErrorHandlingIT.java
similarity index 61%
copy from
quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/excetpion/ServiceException.java
copy to
springboot/integration-tests/integration-tests-springboot-processes-persistence-it/integration-tests-springboot-processes-jdbc/src/test/java/org/kie/kogito/it/JDBCTransactionalErrorHandlingIT.java
index f1b671e1c4..81787f56a4 100644
---
a/quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/excetpion/ServiceException.java
+++
b/springboot/integration-tests/integration-tests-springboot-processes-persistence-it/integration-tests-springboot-processes-jdbc/src/test/java/org/kie/kogito/it/JDBCTransactionalErrorHandlingIT.java
@@ -16,11 +16,14 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.kie.kogito.integrationtests.excetpion;
-public class ServiceException extends RuntimeException {
+package org.kie.kogito.it;
- public ServiceException(String message) {
- super(message);
- }
+import
org.kie.kogito.testcontainers.springboot.PostgreSqlSpringBootTestResource;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ContextConfiguration;
+
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
classes = KogitoSpringbootApplication.class)
+@ContextConfiguration(initializers = PostgreSqlSpringBootTestResource.class)
+public class JDBCTransactionalErrorHandlingIT extends
TransactionalErrorHandlingTest {
}
diff --git
a/springboot/integration-tests/integration-tests-springboot-processes-persistence-it/integration-tests-springboot-processes-persistence-common/src/main/resources/transactional_error.bpmn
b/springboot/integration-tests/integration-tests-springboot-processes-persistence-it/integration-tests-springboot-processes-persistence-common/src/main/resources/transactional_error.bpmn
new file mode 100644
index 0000000000..1635991af1
--- /dev/null
+++
b/springboot/integration-tests/integration-tests-springboot-processes-persistence-it/integration-tests-springboot-processes-persistence-common/src/main/resources/transactional_error.bpmn
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:bpsim="http://www.bpsim.org/schemas/1.0"
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
xmlns:drools="http://www.jboss.org/drools" id="_HxRxkDlJED6vKMe2WKzD0Q"
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd
http://www. [...]
+ <bpmn2:itemDefinition id="_failItem" structureRef="Boolean"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_SkippableInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_PriorityInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_CommentInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_DescriptionInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_CreatedByInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_TaskNameInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_GroupIdInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_ContentInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_NotStartedReassignInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_NotCompletedReassignInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_NotStartedNotifyInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_NotCompletedNotifyInputXItem"
structureRef="Object"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_failInputXItem"
structureRef="Boolean"/>
+ <bpmn2:itemDefinition
id="__E691E0BE-B728-4369-867D-AACC71812F87_failOutputXItem"
structureRef="Boolean"/>
+ <bpmn2:collaboration id="_6CAC7A4D-3A99-48DE-9CB4-FE788E60AEDB"
name="Default Collaboration">
+ <bpmn2:participant id="_CC69D1E8-AB63-42F1-A038-911BEF77413F" name="Pool
Participant" processRef="transactional_errors"/>
+ </bpmn2:collaboration>
+ <bpmn2:process id="transactional_errors" drools:packageName="org.kie.kogito"
drools:version="1.0" drools:adHoc="false" name="transactional_errors"
isExecutable="true" processType="Public">
+ <bpmn2:property id="fail" itemSubjectRef="_failItem" name="fail"/>
+ <bpmn2:sequenceFlow id="_47D94ED0-DBD0-40BF-A8BE-D9CBE9B33611"
sourceRef="_E691E0BE-B728-4369-867D-AACC71812F87"
targetRef="_9413B17A-F1C9-444F-978D-63EFA8CD4801"/>
+ <bpmn2:sequenceFlow id="_75CD85AE-40AB-4D88-BF39-C22CA61DEAC9"
sourceRef="_530D47D5-4BE7-4E54-8F12-C225CB9B3529"
targetRef="_F44C0F61-F897-4D8F-884A-AEBFF906E5FD"/>
+ <bpmn2:sequenceFlow id="_20A1FF12-D2BF-4522-A23A-724F925A7584"
sourceRef="_9413B17A-F1C9-444F-978D-63EFA8CD4801"
targetRef="_530D47D5-4BE7-4E54-8F12-C225CB9B3529"/>
+ <bpmn2:sequenceFlow id="_4A571422-CE8A-4BAD-8D3B-CAD5F9DE07A7"
sourceRef="_48F366CD-9D0F-4E92-AA59-1638DCD5933B"
targetRef="_E691E0BE-B728-4369-867D-AACC71812F87"/>
+ <bpmn2:scriptTask id="_9413B17A-F1C9-444F-978D-63EFA8CD4801"
name="ScriptTask 1" scriptFormat="http://www.java.com/java">
+ <bpmn2:extensionElements>
+ <drools:metaData name="elementname">
+ <drools:metaValue><![CDATA[ScriptTask 1]]></drools:metaValue>
+ </drools:metaData>
+ </bpmn2:extensionElements>
+ <bpmn2:incoming>_47D94ED0-DBD0-40BF-A8BE-D9CBE9B33611</bpmn2:incoming>
+ <bpmn2:outgoing>_20A1FF12-D2BF-4522-A23A-724F925A7584</bpmn2:outgoing>
+ <bpmn2:script>System.out.println("This is a previous task to see if we
catch the error in this node");</bpmn2:script>
+ </bpmn2:scriptTask>
+ <bpmn2:userTask id="_E691E0BE-B728-4369-867D-AACC71812F87" name="Before">
+ <bpmn2:extensionElements>
+ <drools:metaData name="elementname">
+ <drools:metaValue><![CDATA[Before]]></drools:metaValue>
+ </drools:metaData>
+ </bpmn2:extensionElements>
+ <bpmn2:incoming>_4A571422-CE8A-4BAD-8D3B-CAD5F9DE07A7</bpmn2:incoming>
+ <bpmn2:outgoing>_47D94ED0-DBD0-40BF-A8BE-D9CBE9B33611</bpmn2:outgoing>
+ <bpmn2:ioSpecification>
+ <bpmn2:dataInput
id="_E691E0BE-B728-4369-867D-AACC71812F87_TaskNameInputX" drools:dtype="Object"
itemSubjectRef="__E691E0BE-B728-4369-867D-AACC71812F87_TaskNameInputXItem"
name="TaskName"/>
+ <bpmn2:dataInput id="_E691E0BE-B728-4369-867D-AACC71812F87_failInputX"
drools:dtype="Boolean"
itemSubjectRef="__E691E0BE-B728-4369-867D-AACC71812F87_failInputXItem"
name="fail"/>
+ <bpmn2:dataInput
id="_E691E0BE-B728-4369-867D-AACC71812F87_SkippableInputX"
drools:dtype="Object"
itemSubjectRef="__E691E0BE-B728-4369-867D-AACC71812F87_SkippableInputXItem"
name="Skippable"/>
+ <bpmn2:dataOutput
id="_E691E0BE-B728-4369-867D-AACC71812F87_failOutputX" drools:dtype="Boolean"
itemSubjectRef="__E691E0BE-B728-4369-867D-AACC71812F87_failOutputXItem"
name="fail"/>
+ <bpmn2:inputSet>
+
<bpmn2:dataInputRefs>_E691E0BE-B728-4369-867D-AACC71812F87_TaskNameInputX</bpmn2:dataInputRefs>
+
<bpmn2:dataInputRefs>_E691E0BE-B728-4369-867D-AACC71812F87_failInputX</bpmn2:dataInputRefs>
+
<bpmn2:dataInputRefs>_E691E0BE-B728-4369-867D-AACC71812F87_SkippableInputX</bpmn2:dataInputRefs>
+ </bpmn2:inputSet>
+ <bpmn2:outputSet>
+
<bpmn2:dataOutputRefs>_E691E0BE-B728-4369-867D-AACC71812F87_failOutputX</bpmn2:dataOutputRefs>
+ </bpmn2:outputSet>
+ </bpmn2:ioSpecification>
+ <bpmn2:dataInputAssociation>
+
<bpmn2:targetRef>_E691E0BE-B728-4369-867D-AACC71812F87_TaskNameInputX</bpmn2:targetRef>
+ <bpmn2:assignment>
+ <bpmn2:from
xsi:type="bpmn2:tFormalExpression"><![CDATA[Before]]></bpmn2:from>
+ <bpmn2:to
xsi:type="bpmn2:tFormalExpression"><![CDATA[_E691E0BE-B728-4369-867D-AACC71812F87_TaskNameInputX]]></bpmn2:to>
+ </bpmn2:assignment>
+ </bpmn2:dataInputAssociation>
+ <bpmn2:dataInputAssociation>
+ <bpmn2:sourceRef>fail</bpmn2:sourceRef>
+
<bpmn2:targetRef>_E691E0BE-B728-4369-867D-AACC71812F87_failInputX</bpmn2:targetRef>
+ </bpmn2:dataInputAssociation>
+ <bpmn2:dataInputAssociation>
+
<bpmn2:targetRef>_E691E0BE-B728-4369-867D-AACC71812F87_SkippableInputX</bpmn2:targetRef>
+ <bpmn2:assignment>
+ <bpmn2:from
xsi:type="bpmn2:tFormalExpression"><![CDATA[false]]></bpmn2:from>
+ <bpmn2:to
xsi:type="bpmn2:tFormalExpression"><![CDATA[_E691E0BE-B728-4369-867D-AACC71812F87_SkippableInputX]]></bpmn2:to>
+ </bpmn2:assignment>
+ </bpmn2:dataInputAssociation>
+ <bpmn2:dataOutputAssociation>
+
<bpmn2:sourceRef>_E691E0BE-B728-4369-867D-AACC71812F87_failOutputX</bpmn2:sourceRef>
+ <bpmn2:targetRef>fail</bpmn2:targetRef>
+ </bpmn2:dataOutputAssociation>
+ <bpmn2:potentialOwner id="_HxTmwDlJED6vKMe2WKzD0Q">
+ <bpmn2:resourceAssignmentExpression id="_HxTmwTlJED6vKMe2WKzD0Q">
+ <bpmn2:formalExpression>jdoe</bpmn2:formalExpression>
+ </bpmn2:resourceAssignmentExpression>
+ </bpmn2:potentialOwner>
+ </bpmn2:userTask>
+ <bpmn2:endEvent id="_F44C0F61-F897-4D8F-884A-AEBFF906E5FD">
+ <bpmn2:incoming>_75CD85AE-40AB-4D88-BF39-C22CA61DEAC9</bpmn2:incoming>
+ </bpmn2:endEvent>
+ <bpmn2:scriptTask id="_530D47D5-4BE7-4E54-8F12-C225CB9B3529" name="It may
fail" scriptFormat="http://www.java.com/java">
+ <bpmn2:extensionElements>
+ <drools:metaData name="elementname">
+ <drools:metaValue><![CDATA[It may fail]]></drools:metaValue>
+ </drools:metaData>
+ </bpmn2:extensionElements>
+ <bpmn2:incoming>_20A1FF12-D2BF-4522-A23A-724F925A7584</bpmn2:incoming>
+ <bpmn2:outgoing>_75CD85AE-40AB-4D88-BF39-C22CA61DEAC9</bpmn2:outgoing>
+ <bpmn2:script>if(fail) {
+ throw new java.lang.RuntimeException("This is a controlled error... fail
-> true");
+}
+
+System.out.println("Congratulations there's not error!");</bpmn2:script>
+ </bpmn2:scriptTask>
+ <bpmn2:startEvent id="_48F366CD-9D0F-4E92-AA59-1638DCD5933B">
+ <bpmn2:outgoing>_4A571422-CE8A-4BAD-8D3B-CAD5F9DE07A7</bpmn2:outgoing>
+ </bpmn2:startEvent>
+ </bpmn2:process>
+ <bpmndi:BPMNDiagram>
+ <bpmndi:BPMNPlane bpmnElement="transactional_errors">
+ <bpmndi:BPMNShape id="shape__48F366CD-9D0F-4E92-AA59-1638DCD5933B"
bpmnElement="_48F366CD-9D0F-4E92-AA59-1638DCD5933B">
+ <dc:Bounds height="56" width="56" x="104" y="131"/>
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNShape id="shape__530D47D5-4BE7-4E54-8F12-C225CB9B3529"
bpmnElement="_530D47D5-4BE7-4E54-8F12-C225CB9B3529">
+ <dc:Bounds height="102" width="154" x="684" y="108"/>
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNShape id="shape__F44C0F61-F897-4D8F-884A-AEBFF906E5FD"
bpmnElement="_F44C0F61-F897-4D8F-884A-AEBFF906E5FD">
+ <dc:Bounds height="56" width="56" x="918" y="131"/>
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNShape id="shape__E691E0BE-B728-4369-867D-AACC71812F87"
bpmnElement="_E691E0BE-B728-4369-867D-AACC71812F87">
+ <dc:Bounds height="102" width="154" x="216" y="108"/>
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNShape id="shape__9413B17A-F1C9-444F-978D-63EFA8CD4801"
bpmnElement="_9413B17A-F1C9-444F-978D-63EFA8CD4801">
+ <dc:Bounds height="102" width="154" x="450" y="108"/>
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNEdge
id="edge_shape__48F366CD-9D0F-4E92-AA59-1638DCD5933B_to_shape__E691E0BE-B728-4369-867D-AACC71812F87"
bpmnElement="_4A571422-CE8A-4BAD-8D3B-CAD5F9DE07A7">
+ <di:waypoint x="132" y="159"/>
+ <di:waypoint x="293" y="159"/>
+ </bpmndi:BPMNEdge>
+ <bpmndi:BPMNEdge
id="edge_shape__9413B17A-F1C9-444F-978D-63EFA8CD4801_to_shape__530D47D5-4BE7-4E54-8F12-C225CB9B3529"
bpmnElement="_20A1FF12-D2BF-4522-A23A-724F925A7584">
+ <di:waypoint x="527" y="159"/>
+ <di:waypoint x="684" y="159"/>
+ </bpmndi:BPMNEdge>
+ <bpmndi:BPMNEdge
id="edge_shape__530D47D5-4BE7-4E54-8F12-C225CB9B3529_to_shape__F44C0F61-F897-4D8F-884A-AEBFF906E5FD"
bpmnElement="_75CD85AE-40AB-4D88-BF39-C22CA61DEAC9">
+ <di:waypoint x="761" y="159"/>
+ <di:waypoint x="946" y="159"/>
+ </bpmndi:BPMNEdge>
+ <bpmndi:BPMNEdge
id="edge_shape__E691E0BE-B728-4369-867D-AACC71812F87_to_shape__9413B17A-F1C9-444F-978D-63EFA8CD4801"
bpmnElement="_47D94ED0-DBD0-40BF-A8BE-D9CBE9B33611">
+ <di:waypoint x="293" y="159"/>
+ <di:waypoint x="527" y="159"/>
+ </bpmndi:BPMNEdge>
+ </bpmndi:BPMNPlane>
+ </bpmndi:BPMNDiagram>
+ <bpmn2:relationship type="BPSimData">
+ <bpmn2:extensionElements>
+ <bpsim:BPSimData>
+ <bpsim:Scenario id="default" name="Simulationscenario">
+ <bpsim:ScenarioParameters/>
+ <bpsim:ElementParameters
elementRef="_48F366CD-9D0F-4E92-AA59-1638DCD5933B">
+ <bpsim:TimeParameters>
+ <bpsim:ProcessingTime>
+ <bpsim:NormalDistribution mean="0" standardDeviation="0"/>
+ </bpsim:ProcessingTime>
+ </bpsim:TimeParameters>
+ </bpsim:ElementParameters>
+ <bpsim:ElementParameters
elementRef="_530D47D5-4BE7-4E54-8F12-C225CB9B3529">
+ <bpsim:TimeParameters>
+ <bpsim:ProcessingTime>
+ <bpsim:NormalDistribution mean="0" standardDeviation="0"/>
+ </bpsim:ProcessingTime>
+ </bpsim:TimeParameters>
+ <bpsim:ResourceParameters>
+ <bpsim:Availability>
+ <bpsim:FloatingParameter value="0"/>
+ </bpsim:Availability>
+ <bpsim:Quantity>
+ <bpsim:FloatingParameter value="0"/>
+ </bpsim:Quantity>
+ </bpsim:ResourceParameters>
+ <bpsim:CostParameters>
+ <bpsim:UnitCost>
+ <bpsim:FloatingParameter value="0"/>
+ </bpsim:UnitCost>
+ </bpsim:CostParameters>
+ </bpsim:ElementParameters>
+ <bpsim:ElementParameters
elementRef="_E691E0BE-B728-4369-867D-AACC71812F87">
+ <bpsim:TimeParameters>
+ <bpsim:ProcessingTime>
+ <bpsim:NormalDistribution mean="0" standardDeviation="0"/>
+ </bpsim:ProcessingTime>
+ </bpsim:TimeParameters>
+ <bpsim:ResourceParameters>
+ <bpsim:Availability>
+ <bpsim:FloatingParameter value="0"/>
+ </bpsim:Availability>
+ <bpsim:Quantity>
+ <bpsim:FloatingParameter value="0"/>
+ </bpsim:Quantity>
+ </bpsim:ResourceParameters>
+ <bpsim:CostParameters>
+ <bpsim:UnitCost>
+ <bpsim:FloatingParameter value="0"/>
+ </bpsim:UnitCost>
+ </bpsim:CostParameters>
+ </bpsim:ElementParameters>
+ <bpsim:ElementParameters
elementRef="_9413B17A-F1C9-444F-978D-63EFA8CD4801">
+ <bpsim:TimeParameters>
+ <bpsim:ProcessingTime>
+ <bpsim:NormalDistribution mean="0" standardDeviation="0"/>
+ </bpsim:ProcessingTime>
+ </bpsim:TimeParameters>
+ <bpsim:ResourceParameters>
+ <bpsim:Availability>
+ <bpsim:FloatingParameter value="0"/>
+ </bpsim:Availability>
+ <bpsim:Quantity>
+ <bpsim:FloatingParameter value="0"/>
+ </bpsim:Quantity>
+ </bpsim:ResourceParameters>
+ <bpsim:CostParameters>
+ <bpsim:UnitCost>
+ <bpsim:FloatingParameter value="0"/>
+ </bpsim:UnitCost>
+ </bpsim:CostParameters>
+ </bpsim:ElementParameters>
+ </bpsim:Scenario>
+ </bpsim:BPSimData>
+ </bpmn2:extensionElements>
+ <bpmn2:source>_HxRxkDlJED6vKMe2WKzD0Q</bpmn2:source>
+ <bpmn2:target>_HxRxkDlJED6vKMe2WKzD0Q</bpmn2:target>
+ </bpmn2:relationship>
+</bpmn2:definitions>
\ No newline at end of file
diff --git
a/springboot/integration-tests/integration-tests-springboot-processes-persistence-it/integration-tests-springboot-processes-persistence-common/src/test/java/org/kie/kogito/it/TransactionalErrorHandlingTest.java
b/springboot/integration-tests/integration-tests-springboot-processes-persistence-it/integration-tests-springboot-processes-persistence-common/src/test/java/org/kie/kogito/it/TransactionalErrorHandlingTest.java
new file mode 100644
index 0000000000..649b1c89f3
--- /dev/null
+++
b/springboot/integration-tests/integration-tests-springboot-processes-persistence-it/integration-tests-springboot-processes-persistence-common/src/test/java/org/kie/kogito/it/TransactionalErrorHandlingTest.java
@@ -0,0 +1,172 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.kie.kogito.it;
+
+import java.util.Map;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.kie.kogito.usertask.model.TransitionInfo;
+import org.springframework.boot.test.web.server.LocalServerPort;
+
+import io.restassured.RestAssured;
+import io.restassured.http.ContentType;
+
+import static io.restassured.RestAssured.given;
+import static org.hamcrest.CoreMatchers.*;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.emptyOrNullString;
+
+public abstract class TransactionalErrorHandlingTest {
+ private static final String USER_TASK_BASE_PATH = "/usertasks/instance";
+ private static final String MANAGEMENT_INSTANCE_PATH =
"/management/processes/{processId}/instances/{processInstanceId}";
+
+ private static final String ERRORS_PROCESS = "transactional_errors";
+
+ static {
+ RestAssured.enableLoggingOfRequestAndResponseIfValidationFails();
+ }
+
+ @LocalServerPort
+ private int httpPort;
+
+ @BeforeEach
+ void setPort() {
+ RestAssured.port = httpPort;
+ }
+
+ @Test
+ void testTransactionalErrorsProcess() {
+ String pId = given().contentType(ContentType.JSON)
+ .when()
+ .body(Map.of("fail", true))
+ .post("/{processId}", ERRORS_PROCESS)
+ .then()
+ .statusCode(201)
+ .body("id", not(emptyOrNullString()))
+ .extract()
+ .path("id");
+
+ String userTaskId = given()
+ .basePath(USER_TASK_BASE_PATH)
+ .queryParam("user", "jdoe")
+ .queryParam("group", "user")
+ .contentType(ContentType.JSON)
+ .when()
+ .get()
+ .then()
+ .statusCode(200)
+ .extract()
+ .body()
+ .path("[0].id");
+
+ given()
+ .contentType(ContentType.JSON)
+ .basePath(USER_TASK_BASE_PATH)
+ .queryParam("user", "jdoe")
+ .queryParam("group", "user")
+ .body(new TransitionInfo("complete", Map.of("fail", true)))
+ .when()
+ .post("/{userTaskId}/transition", userTaskId)
+ .then()
+ .statusCode(500);
+
+ given()
+ .contentType(ContentType.JSON)
+ .basePath(MANAGEMENT_INSTANCE_PATH)
+ .pathParam("processId", ERRORS_PROCESS)
+ .pathParam("processInstanceId", pId)
+ .when()
+ .get("error")
+ .then()
+ .statusCode(200)
+ .body("failedNodeId",
equalTo("_E691E0BE-B728-4369-867D-AACC71812F87"))
+ .body("id", equalTo(pId))
+ .body("message", containsString("java.lang.RuntimeException -
This is a controlled error... fail -> true"));
+
+ given()
+ .basePath(USER_TASK_BASE_PATH)
+ .queryParam("user", "jdoe")
+ .queryParam("group", "user")
+ .contentType(ContentType.JSON)
+ .when()
+ .get()
+ .then()
+ .statusCode(200)
+ .body("[0].id", equalTo(userTaskId));
+
+ given()
+ .contentType(ContentType.JSON)
+ .basePath(MANAGEMENT_INSTANCE_PATH)
+ .pathParam("processId", ERRORS_PROCESS)
+ .pathParam("processInstanceId", pId)
+ .when()
+ .post("retrigger")
+ .then()
+ .statusCode(200)
+ .body("id", equalTo(pId))
+ .body("fail", equalTo(true));
+
+ given()
+ .contentType(ContentType.JSON)
+ .basePath(MANAGEMENT_INSTANCE_PATH)
+ .pathParam("processId", ERRORS_PROCESS)
+ .pathParam("processInstanceId", pId)
+ .when()
+ .get("error")
+ .then()
+ .statusCode(400)
+ .body(equalTo("Process instance with id " + pId + " is not in
error state"));
+
+ userTaskId = given()
+ .basePath(USER_TASK_BASE_PATH)
+ .queryParam("user", "jdoe")
+ .queryParam("group", "user")
+ .contentType(ContentType.JSON)
+ .when()
+ .get()
+ .then()
+ .statusCode(200)
+ .body("[0].id", not(equalTo(userTaskId)))
+ .extract()
+ .body()
+ .path("[0].id");
+
+ given()
+ .contentType(ContentType.JSON)
+ .basePath(USER_TASK_BASE_PATH)
+ .queryParam("user", "jdoe")
+ .queryParam("group", "user")
+ .body(new TransitionInfo("complete", Map.of("fail", false)))
+ .when()
+ .post("/{userTaskId}/transition", userTaskId)
+ .then()
+ .statusCode(200);
+
+ given()
+ .accept(ContentType.JSON)
+ .when()
+ .pathParam("processId", ERRORS_PROCESS)
+ .get("/{processId}")
+ .then()
+ .statusCode(200)
+ .body("size()", is(0));
+ }
+}
diff --git
a/quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/excetpion/ServiceException.java
b/springboot/integration-tests/integration-tests-springboot-processes-persistence-it/integration-tests-springboot-processes-postgresql/src/test/java/org/kie/kogito/it/PostgreSQLTransactionalErrorHandlingIT.java
similarity index 60%
rename from
quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/excetpion/ServiceException.java
rename to
springboot/integration-tests/integration-tests-springboot-processes-persistence-it/integration-tests-springboot-processes-postgresql/src/test/java/org/kie/kogito/it/PostgreSQLTransactionalErrorHandlingIT.java
index f1b671e1c4..27bbe119f3 100644
---
a/quarkus/integration-tests/integration-tests-quarkus-processes/src/main/java/org/kie/kogito/integrationtests/excetpion/ServiceException.java
+++
b/springboot/integration-tests/integration-tests-springboot-processes-persistence-it/integration-tests-springboot-processes-postgresql/src/test/java/org/kie/kogito/it/PostgreSQLTransactionalErrorHandlingIT.java
@@ -16,11 +16,14 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.kie.kogito.integrationtests.excetpion;
-public class ServiceException extends RuntimeException {
+package org.kie.kogito.it;
- public ServiceException(String message) {
- super(message);
- }
+import
org.kie.kogito.testcontainers.springboot.PostgreSqlSpringBootTestResource;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ContextConfiguration;
+
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
classes = KogitoSpringbootApplication.class)
+@ContextConfiguration(initializers = PostgreSqlSpringBootTestResource.class)
+public class PostgreSQLTransactionalErrorHandlingIT extends
TransactionalErrorHandlingTest {
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]