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]

Reply via email to