This is an automated email from the ASF dual-hosted git repository.
mweiler 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 3fb6a68047 [kie-issues#2185] Follow-up to fix transaction rollback in
case of a process execution failure (#4159)
3fb6a68047 is described below
commit 3fb6a68047838f5caf97a507c9a54567069a8c1f
Author: Martin Weiler <[email protected]>
AuthorDate: Thu Jan 15 09:13:51 2026 -0700
[kie-issues#2185] Follow-up to fix transaction rollback in case of a
process execution failure (#4159)
* [kie-issues#2185] Follow-up to fix transaction rollback in case of a
process execution failure
* Improve isTransactional check
* Log WARN message in case the runtime does not support transactions
---
.../org/kie/kogito/codegen/api/context/KogitoBuildContext.java | 4 ++++
.../kie/kogito/codegen/api/utils/KogitoCodeGenConstants.java | 2 ++
.../java/org/kie/kogito/codegen/core/utils/CodegenUtil.java | 9 ++++++++-
.../class-templates/events/TxEventReceiverQuarkusTemplate.java | 8 +++++++-
.../codegen/process/events/CodegenMessageStartEventTest.java | 10 ++++++++--
.../kie/kogito/codegen/process/events/CodegenUserTaskTest.java | 7 ++++++-
.../org/kie/kogito/codegen/usertask/UserTaskCodegenTest.java | 9 +++++++++
7 files changed, 44 insertions(+), 5 deletions(-)
diff --git
a/kogito-codegen-modules/kogito-codegen-api/src/main/java/org/kie/kogito/codegen/api/context/KogitoBuildContext.java
b/kogito-codegen-modules/kogito-codegen-api/src/main/java/org/kie/kogito/codegen/api/context/KogitoBuildContext.java
index 5bb7f95dc7..1d53c88036 100644
---
a/kogito-codegen-modules/kogito-codegen-api/src/main/java/org/kie/kogito/codegen/api/context/KogitoBuildContext.java
+++
b/kogito-codegen-modules/kogito-codegen-api/src/main/java/org/kie/kogito/codegen/api/context/KogitoBuildContext.java
@@ -118,6 +118,10 @@ public interface KogitoBuildContext extends
DroolsModelBuildContext {
return hasClassAvailable(KogitoCodeGenConstants.OPENAPI_SPEC_CLASS);
}
+ default boolean isTransactionSupported() {
+ return
hasClassAvailable(KogitoCodeGenConstants.QUARKUS_TRANSACTION_MANAGER_CLASS) ||
hasClassAvailable(KogitoCodeGenConstants.SPRING_TRANSACTION_MANAGER_CLASS);
+ }
+
/**
* Whether to ignore hidden files when collecting resources to generate
code.
* Platforms should provide a property named #IGNORE_HIDDEN_FILES_PROP.
diff --git
a/kogito-codegen-modules/kogito-codegen-api/src/main/java/org/kie/kogito/codegen/api/utils/KogitoCodeGenConstants.java
b/kogito-codegen-modules/kogito-codegen-api/src/main/java/org/kie/kogito/codegen/api/utils/KogitoCodeGenConstants.java
index 70c2da73a9..05573fba02 100644
---
a/kogito-codegen-modules/kogito-codegen-api/src/main/java/org/kie/kogito/codegen/api/utils/KogitoCodeGenConstants.java
+++
b/kogito-codegen-modules/kogito-codegen-api/src/main/java/org/kie/kogito/codegen/api/utils/KogitoCodeGenConstants.java
@@ -26,6 +26,8 @@ public class KogitoCodeGenConstants {
public static final String VALIDATION_CLASS =
"jakarta.validation.constraints.NotNull";
public static final String OPENAPI_SPEC_CLASS =
"org.eclipse.microprofile.openapi.annotations.media.Schema";
+ public static final String QUARKUS_TRANSACTION_MANAGER_CLASS =
"io.quarkus.narayana.jta.QuarkusTransaction";
+ public static final String SPRING_TRANSACTION_MANAGER_CLASS =
"org.springframework.transaction.PlatformTransactionManager";
/**
* Property that controls whether Kogito Codegen should ignore hidden
files. Defaults to true.
*/
diff --git
a/kogito-codegen-modules/kogito-codegen-core/src/main/java/org/kie/kogito/codegen/core/utils/CodegenUtil.java
b/kogito-codegen-modules/kogito-codegen-core/src/main/java/org/kie/kogito/codegen/core/utils/CodegenUtil.java
index df16bd5e7a..4a62cb9f68 100644
---
a/kogito-codegen-modules/kogito-codegen-core/src/main/java/org/kie/kogito/codegen/core/utils/CodegenUtil.java
+++
b/kogito-codegen-modules/kogito-codegen-core/src/main/java/org/kie/kogito/codegen/core/utils/CodegenUtil.java
@@ -81,7 +81,14 @@ public final class CodegenUtil {
boolean propertyValue = getProperty(generator, context,
TRANSACTION_ENABLED, Boolean::parseBoolean, defaultValue);
LOG.debug("Compute property {} for generator {} property with value
{}", TRANSACTION_ENABLED, generator.name(), propertyValue);
// java implementation does not have transactions
- return !JavaKogitoBuildContext.CONTEXT_NAME.equals(context.name()) &&
propertyValue;
+ if (JavaKogitoBuildContext.CONTEXT_NAME.equals(context.name())) {
+ return false;
+ }
+ if (propertyValue && !context.isTransactionSupported()) {
+ LOG.warn("Disabling Transaction because runtime support for
transaction is not available.");
+ return false;
+ }
+ return context.isTransactionSupported() && propertyValue;
}
/**
diff --git
a/kogito-codegen-modules/kogito-codegen-events/src/main/resources/class-templates/events/TxEventReceiverQuarkusTemplate.java
b/kogito-codegen-modules/kogito-codegen-events/src/main/resources/class-templates/events/TxEventReceiverQuarkusTemplate.java
index 70cd2564a7..f9d2ace148 100644
---
a/kogito-codegen-modules/kogito-codegen-events/src/main/resources/class-templates/events/TxEventReceiverQuarkusTemplate.java
+++
b/kogito-codegen-modules/kogito-codegen-events/src/main/resources/class-templates/events/TxEventReceiverQuarkusTemplate.java
@@ -26,6 +26,8 @@ import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Named;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
+import jakarta.transaction.TransactionManager;
+import jakarta.transaction.SystemException;
import org.eclipse.microprofile.reactive.messaging.Incoming;
import org.eclipse.microprofile.reactive.messaging.Message;
@@ -45,13 +47,17 @@ import io.quarkus.runtime.Startup;
@Named("Receiver-$ChannelName$")
public class $ClassName$ extends AbstractQuarkusCloudEventReceiver<$Type$> {
+ @Inject
+ TransactionManager transactionManager;
+
@Incoming("$ChannelName$")
@Transactional
@Blocking
- public CompletionStage<Void> onEvent(Message<$Type$> payload) {
+ public CompletionStage<Void> onEvent(Message<$Type$> payload) throws
SystemException {
try {
produce(payload);
} catch (Exception ex) {
+ transactionManager.setRollbackOnly();
return payload.nack(ex);
}
return payload.ack();
diff --git
a/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/events/CodegenMessageStartEventTest.java
b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/events/CodegenMessageStartEventTest.java
index 3c4f281c0f..b3de66d44b 100644
---
a/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/events/CodegenMessageStartEventTest.java
+++
b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/events/CodegenMessageStartEventTest.java
@@ -29,6 +29,7 @@ import org.drools.codegen.common.GeneratedFile;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import org.kie.kogito.codegen.api.context.KogitoBuildContext;
+import org.kie.kogito.codegen.api.utils.KogitoCodeGenConstants;
import org.kie.kogito.codegen.core.io.CollectedResourceProducer;
import org.kie.kogito.codegen.process.ProcessCodegen;
@@ -37,7 +38,10 @@ import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.body.MethodDeclaration;
+import static java.util.Collections.emptyList;
+import static java.util.Collections.singleton;
import static org.assertj.core.api.Assertions.assertThat;
+import static
org.kie.kogito.codegen.api.utils.KogitoContextTestUtils.mockClassAvailabilityResolver;
public class CodegenMessageStartEventTest {
@@ -52,7 +56,8 @@ public class CodegenMessageStartEventTest {
@ParameterizedTest
@MethodSource("org.kie.kogito.codegen.api.utils.KogitoContextTestUtils#restContextBuilders")
public void testRESTApiForMessageStartEvent(KogitoBuildContext.Builder
contextBuilder) {
-
+ contextBuilder
+
.withClassAvailabilityResolver(mockClassAvailabilityResolver(singleton(KogitoCodeGenConstants.QUARKUS_TRANSACTION_MANAGER_CLASS),
emptyList()));
KogitoBuildContext context = contextBuilder.build();
ProcessCodegen codeGenerator = ProcessCodegen.ofCollectedResources(
context,
@@ -83,7 +88,8 @@ public class CodegenMessageStartEventTest {
@ParameterizedTest
@MethodSource("org.kie.kogito.codegen.api.utils.KogitoContextTestUtils#restContextBuilders")
public void testRESTApiForMessageEndEvent(KogitoBuildContext.Builder
contextBuilder) {
-
+ contextBuilder
+
.withClassAvailabilityResolver(mockClassAvailabilityResolver(singleton(KogitoCodeGenConstants.QUARKUS_TRANSACTION_MANAGER_CLASS),
emptyList()));
KogitoBuildContext context = contextBuilder.build();
ProcessCodegen codeGenerator = ProcessCodegen.ofCollectedResources(
context,
diff --git
a/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/events/CodegenUserTaskTest.java
b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/events/CodegenUserTaskTest.java
index 24f875c2a0..39719dc2c4 100644
---
a/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/events/CodegenUserTaskTest.java
+++
b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/events/CodegenUserTaskTest.java
@@ -27,6 +27,7 @@ import org.drools.codegen.common.GeneratedFile;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import org.kie.kogito.codegen.api.context.KogitoBuildContext;
+import org.kie.kogito.codegen.api.utils.KogitoCodeGenConstants;
import org.kie.kogito.codegen.core.io.CollectedResourceProducer;
import org.kie.kogito.codegen.process.ProcessCodegen;
@@ -34,7 +35,10 @@ import com.github.javaparser.StaticJavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.body.MethodDeclaration;
+import static java.util.Collections.emptyList;
+import static java.util.Collections.singleton;
import static org.assertj.core.api.Assertions.assertThat;
+import static
org.kie.kogito.codegen.api.utils.KogitoContextTestUtils.mockClassAvailabilityResolver;
public class CodegenUserTaskTest {
@@ -45,7 +49,8 @@ public class CodegenUserTaskTest {
@ParameterizedTest
@MethodSource("org.kie.kogito.codegen.api.utils.KogitoContextTestUtils#restContextBuilders")
public void testRESTApiForMessageStartEvent(KogitoBuildContext.Builder
contextBuilder) {
-
+ contextBuilder
+
.withClassAvailabilityResolver(mockClassAvailabilityResolver(singleton(KogitoCodeGenConstants.QUARKUS_TRANSACTION_MANAGER_CLASS),
emptyList()));
KogitoBuildContext context = contextBuilder.build();
ProcessCodegen codeGenerator = ProcessCodegen.ofCollectedResources(
context,
diff --git
a/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/usertask/UserTaskCodegenTest.java
b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/usertask/UserTaskCodegenTest.java
index 3c70a5aae8..0347bbe4cd 100644
---
a/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/usertask/UserTaskCodegenTest.java
+++
b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/usertask/UserTaskCodegenTest.java
@@ -27,6 +27,7 @@ import org.drools.codegen.common.rest.RestAnnotator;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import org.kie.kogito.codegen.api.context.KogitoBuildContext;
+import org.kie.kogito.codegen.api.utils.KogitoCodeGenConstants;
import org.kie.kogito.codegen.core.utils.CodegenUtil;
import org.kie.kogito.codegen.process.ProcessCodegenException;
@@ -34,8 +35,10 @@ import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.body.MethodDeclaration;
import static java.util.Collections.emptyList;
+import static java.util.Collections.singleton;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static
org.kie.kogito.codegen.api.utils.KogitoContextTestUtils.mockClassAvailabilityResolver;
import static org.kie.kogito.codegen.process.ProcessResourceGeneratorTest.*;
public class UserTaskCodegenTest {
@@ -43,6 +46,8 @@ public class UserTaskCodegenTest {
@ParameterizedTest
@MethodSource("org.kie.kogito.codegen.api.utils.KogitoContextTestUtils#restContextBuilders")
void
testUserTaskManageTransactionalEnabledByDefault(KogitoBuildContext.Builder
contextBuilder) {
+ contextBuilder
+
.withClassAvailabilityResolver(mockClassAvailabilityResolver(singleton(KogitoCodeGenConstants.QUARKUS_TRANSACTION_MANAGER_CLASS),
emptyList()));
KogitoBuildContext context = contextBuilder.build();
UserTaskCodegen userTaskCodegen = new UserTaskCodegen(context,
Collections.emptyList());
CompilationUnit compilationUnit =
userTaskCodegen.createRestEndpointCompilationUnit();
@@ -79,6 +84,8 @@ public class UserTaskCodegenTest {
@ParameterizedTest
@MethodSource("org.kie.kogito.codegen.api.utils.KogitoContextTestUtils#restContextBuilders")
void testUserTaskManageTransactionalEnabled(KogitoBuildContext.Builder
contextBuilder) {
+ contextBuilder
+
.withClassAvailabilityResolver(mockClassAvailabilityResolver(singleton(KogitoCodeGenConstants.QUARKUS_TRANSACTION_MANAGER_CLASS),
emptyList()));
KogitoBuildContext context = contextBuilder.build();
UserTaskCodegen userTaskCodegen = new UserTaskCodegen(context,
Collections.emptyList());
context.setApplicationProperty(CodegenUtil.globalProperty(CodegenUtil.TRANSACTION_ENABLED),
"true");
@@ -115,6 +122,8 @@ public class UserTaskCodegenTest {
@ParameterizedTest
@MethodSource("org.kie.kogito.codegen.api.utils.KogitoContextTestUtils#restContextBuilders")
void testUserTaskFaultToleranceEnabled(KogitoBuildContext.Builder
contextBuilder) {
+ contextBuilder
+
.withClassAvailabilityResolver(mockClassAvailabilityResolver(singleton(KogitoCodeGenConstants.QUARKUS_TRANSACTION_MANAGER_CLASS),
emptyList()));
KogitoBuildContext context = contextBuilder.build();
UserTaskCodegen userTaskCodegen = new UserTaskCodegen(context,
Collections.emptyList());
CompilationUnit compilationUnit =
userTaskCodegen.createRestEndpointCompilationUnit();
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]