You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by ju...@apache.org on 2025/08/02 19:59:59 UTC

(tomee) 01/01: TOMEE-4518 - remove transaction propagation

This is an automated email from the ASF dual-hosted git repository.

jungm pushed a commit to branch TOMEE-4518
in repository https://gitbox.apache.org/repos/asf/tomee.git

commit a810f0f1f8cc63c7243badd21bf58ce2b825528e
Author: Markus Jung <ju...@apache.org>
AuthorDate: Sat Aug 2 21:59:33 2025 +0200

    TOMEE-4518 - remove transaction propagation
---
 .../openejb/cdi/OWBContextThreadListener.java      |  2 +-
 .../cdi/RequestScopedThreadContextListener.java    |  2 +-
 .../config/ConvertContextServiceDefinitions.java   |  6 +--
 .../org/apache/openejb/core/ThreadContext.java     |  8 +--
 .../apache/openejb/core/ThreadContextListener.java |  3 +-
 .../openejb/core/ivm/BaseEjbProxyHandler.java      |  2 +-
 .../core/security/AbstractSecurityService.java     |  2 +-
 .../core/transaction/EjbTransactionUtil.java       |  4 +-
 .../impl/ApplicationThreadContextProvider.java     |  2 +-
 .../impl/SecurityThreadContextProvider.java        |  2 +-
 .../threads/impl/TxThreadContextProvider.java      | 28 +---------
 docs/admin/configuration/resources.adoc            | 62 ++++------------------
 .../catalina/TomcatThreadContextListener.java      |  2 +-
 13 files changed, 27 insertions(+), 98 deletions(-)

diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/OWBContextThreadListener.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/OWBContextThreadListener.java
index 16ebce373d..7b80d26148 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/OWBContextThreadListener.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/OWBContextThreadListener.java
@@ -34,7 +34,7 @@ public class OWBContextThreadListener implements ThreadContextListener {
     private final ThreadSingletonService singletonService = SystemInstance.get().getComponent(ThreadSingletonService.class);
 
     @Override
-    public void contextEntered(final ThreadContext oldContext, final ThreadContext newContext, boolean propagateTx) {
+    public void contextEntered(final ThreadContext oldContext, final ThreadContext newContext) {
         final BeanContext beanContext = newContext.getBeanContext();
         if (beanContext == null) { // OWBContextHolder will be null so calling contextExited will throw a NPE
             return;
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/RequestScopedThreadContextListener.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/RequestScopedThreadContextListener.java
index c2df039e9e..7fbe6aa595 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/RequestScopedThreadContextListener.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/RequestScopedThreadContextListener.java
@@ -31,7 +31,7 @@ import jakarta.enterprise.context.spi.Context;
  */
 public class RequestScopedThreadContextListener implements ThreadContextListener {
     @Override
-    public void contextEntered(final ThreadContext oldContext, final ThreadContext newContext, boolean propagateTx) {
+    public void contextEntered(final ThreadContext oldContext, final ThreadContext newContext) {
 
         final BeanContext beanContext = newContext.getBeanContext();
 
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/config/ConvertContextServiceDefinitions.java b/container/openejb-core/src/main/java/org/apache/openejb/config/ConvertContextServiceDefinitions.java
index edf2272323..6fc60d12d9 100755
--- a/container/openejb-core/src/main/java/org/apache/openejb/config/ConvertContextServiceDefinitions.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/config/ConvertContextServiceDefinitions.java
@@ -85,9 +85,9 @@ public class ConvertContextServiceDefinitions extends BaseConvertDefinitions {
         def.setType(jakarta.enterprise.concurrent.ContextService.class.getName());
 
         final Properties p = def.getProperties();
-        put(p, "propagated", Join.join(",", contextService.getPropagated()));
-        put(p, "cleared", Join.join(",", contextService.getCleared()));
-        put(p, "unchanged", Join.join(",", contextService.getUnchanged()));
+        put(p, "Propagated", Join.join(",", contextService.getPropagated()));
+        put(p, "Cleared", Join.join(",", contextService.getCleared()));
+        put(p, "Unchanged", Join.join(",", contextService.getUnchanged()));
 
         // to force it to be bound in JndiEncBuilder
         put(p, "JndiName", def.getJndi());
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/ThreadContext.java b/container/openejb-core/src/main/java/org/apache/openejb/core/ThreadContext.java
index 0f2867a60f..374031bd65 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/ThreadContext.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/ThreadContext.java
@@ -39,7 +39,7 @@ public class ThreadContext {
         return threadStorage.get();
     }
 
-    public static ThreadContext enter(final ThreadContext newContext, final boolean propagateTx) {
+    public static ThreadContext enter(final ThreadContext newContext) {
         if (newContext == null) {
             throw new NullPointerException("newContext is null");
         }
@@ -56,7 +56,7 @@ public class ThreadContext {
         // notify listeners
         for (final ThreadContextListener listener : listeners) {
             try {
-                listener.contextEntered(oldContext, newContext, propagateTx);
+                listener.contextEntered(oldContext, newContext);
             } catch (final Throwable e) {
                 log.warning("ThreadContextListener threw an exception", e);
             }
@@ -67,10 +67,6 @@ public class ThreadContext {
 
     }
 
-    public static ThreadContext enter(final ThreadContext newContext) {
-        return enter(newContext, true);
-    }
-
     public static void exit(final ThreadContext oldContext) {
         final ThreadContext exitingContext = threadStorage.get();
         if (exitingContext == null) {
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/ThreadContextListener.java b/container/openejb-core/src/main/java/org/apache/openejb/core/ThreadContextListener.java
index 340fb71c7e..03f344b90d 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/ThreadContextListener.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/ThreadContextListener.java
@@ -23,9 +23,8 @@ public interface ThreadContextListener {
      *
      * @param oldContext  the old context that was associated with the thread
      * @param newContext  the new context that is now associated with the thread
-     * @param propagateTx
      */
-    void contextEntered(ThreadContext oldContext, ThreadContext newContext, boolean propagateTx);
+    void contextEntered(ThreadContext oldContext, ThreadContext newContext);
 
     /**
      * A context has exited.  The reentered context is already associated with the thread.
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/BaseEjbProxyHandler.java b/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/BaseEjbProxyHandler.java
index f2b1008e11..5491d9c987 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/BaseEjbProxyHandler.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/ivm/BaseEjbProxyHandler.java
@@ -87,7 +87,7 @@ public abstract class BaseEjbProxyHandler implements InvocationHandler, Serializ
     static {
         ThreadContext.addThreadContextListener(new ThreadContextListener() {
             @Override
-            public void contextEntered(final ThreadContext oldContext, final ThreadContext newContext, boolean propagateTx) {
+            public void contextEntered(final ThreadContext oldContext, final ThreadContext newContext) {
                 // no-op
             }
 
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java b/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java
index 9213982c83..d6687fbb0e 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java
@@ -175,7 +175,7 @@ public abstract class AbstractSecurityService implements DestroyableResource, Se
     }
 
     @Override
-    public void contextEntered(final ThreadContext oldContext, final ThreadContext newContext, boolean propagateTx) {
+    public void contextEntered(final ThreadContext oldContext, final ThreadContext newContext) {
         final String moduleID = newContext.getBeanContext().getModuleID();
         JavaSecurityManagers.setContextID(moduleID);
 
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/EjbTransactionUtil.java b/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/EjbTransactionUtil.java
index 67c1e9c715..3c82d0334c 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/EjbTransactionUtil.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/transaction/EjbTransactionUtil.java
@@ -36,9 +36,9 @@ public final class EjbTransactionUtil {
     static {
         ThreadContext.addThreadContextListener(new ThreadContextListener() {
             @Override
-            public void contextEntered(final ThreadContext oldContext, final ThreadContext newContext, boolean propagateTx) {
+            public void contextEntered(final ThreadContext oldContext, final ThreadContext newContext) {
                 // propagate current tx environment to the new ThreadContext
-                if (oldContext != null && propagateTx) {
+                if (oldContext != null) {
                     newContext.setTransactionPolicy(oldContext.getTransactionPolicy());
                 }
             }
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ApplicationThreadContextProvider.java b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ApplicationThreadContextProvider.java
index 12d0333527..8167228682 100755
--- a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ApplicationThreadContextProvider.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/ApplicationThreadContextProvider.java
@@ -73,7 +73,7 @@ public class ApplicationThreadContextProvider implements ThreadContextProvider,
 
             // Don't touch ThreadContext if it is already correct or none was captured
             boolean changeThreadContext = threadContext != null && threadContext != ThreadContext.getThreadContext();
-            ThreadContext oldThreadContext = changeThreadContext ? ThreadContext.enter(threadContext, false) : null;
+            ThreadContext oldThreadContext = changeThreadContext ? ThreadContext.enter(threadContext) : null;
             return new ApplicationThreadContextRestorer(oldCl, oldThreadContext, changeThreadContext);
         }
     }
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/SecurityThreadContextProvider.java b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/SecurityThreadContextProvider.java
index 7892fb7f1c..890ff68e37 100755
--- a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/SecurityThreadContextProvider.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/SecurityThreadContextProvider.java
@@ -114,7 +114,7 @@ public class SecurityThreadContextProvider implements ThreadContextProvider, Ser
             final ThreadContext oldCtx;
             if (threadContext != null) {
                 final ThreadContext newContext = new ThreadContext(threadContext);
-                oldCtx = ThreadContext.enter(newContext, false);
+                oldCtx = ThreadContext.enter(newContext);
                 if (sc != null) {
                     newContext.set(AbstractSecurityService.SecurityContext.class, sc);
                 }
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/TxThreadContextProvider.java b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/TxThreadContextProvider.java
index 09153c825c..e933894183 100755
--- a/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/TxThreadContextProvider.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/threads/impl/TxThreadContextProvider.java
@@ -35,11 +35,7 @@ public class TxThreadContextProvider implements ThreadContextProvider, Serializa
 
     @Override
     public ThreadContextSnapshot currentContext(final Map<String, String> props) {
-        try {
-            return new TxThreadContextRestoringSnapshot(OpenEJB.getTransactionManager().getTransaction());
-        } catch (SystemException e) {
-            throw new OpenEJBRuntimeException(e);
-        }
+        return ThreadContextProviderUtil.NOOP_SNAPSHOT;
     }
 
     @Override
@@ -52,7 +48,6 @@ public class TxThreadContextProvider implements ThreadContextProvider, Serializa
         return ContextServiceDefinition.TRANSACTION;
     }
 
-    // Basically TxThreadContextSnapshot but being serializable because it does not store a non-serializable transaction
     public static class TxThreadContextClearingSnapshot implements ThreadContextSnapshot, Serializable {
         public static final TxThreadContextClearingSnapshot INSTANCE = new TxThreadContextClearingSnapshot();
 
@@ -71,27 +66,6 @@ public class TxThreadContextProvider implements ThreadContextProvider, Serializa
         }
     }
 
-    public static class TxThreadContextRestoringSnapshot implements ThreadContextSnapshot {
-        private final Transaction transaction;
-
-        public TxThreadContextRestoringSnapshot(Transaction transaction) {
-            this.transaction = transaction;
-        }
-
-        @Override
-        public ThreadContextRestorer begin() {
-            TransactionManager transactionManager = OpenEJB.getTransactionManager();
-
-            try {
-                Transaction oldTransaction = transactionManager.suspend();
-                transactionManager.resume(transaction);
-                return new TxThreadContextRestorer(oldTransaction);
-            } catch (SystemException | InvalidTransactionException e) {
-                throw new OpenEJBRuntimeException(e);
-            }
-        }
-    }
-
     public static class TxThreadContextRestorer implements ThreadContextRestorer {
         private final Transaction transaction;
 
diff --git a/docs/admin/configuration/resources.adoc b/docs/admin/configuration/resources.adoc
index 00ef6132d2..c4ba60b2ee 100644
--- a/docs/admin/configuration/resources.adoc
+++ b/docs/admin/configuration/resources.adoc
@@ -487,29 +487,10 @@ Declarable in tomee.xml via
 
 [source,xml]
 ----
-<Resource id="Foo" type="ContextService" />
-----
-
-Declarable in properties via
-
-[source,properties]
-----
-Foo = new://Resource?type=ContextService
-----
-
-
-== JndiProvider: inject remote clients
-
-A thread factory for a `ManagedExecutorService`.
-Default implementation is `org.apache.openejb.threads.impl.ManagedThreadFactoryImpl`.
-
-Declarable in tomee.xml via
-
-[source,xml]
-----
-<Resource id="Foo" type="ManagedThreadFactory">
-    Prefix = openejb-managed-thread-
-    Lazy = true
+<Resource id="Foo" type="ContextService">
+  Propagated = Remaining
+  Cleared = Transaction
+  Unchanged = MyFoo
 </Resource>
 ----
 
@@ -517,34 +498,13 @@ Declarable in properties via
 
 [source,properties]
 ----
-Foo = new://Resource?type=ManagedThreadFactory
-Foo.Prefix = openejb-managed-thread-
-Foo.Lazy = true
+Foo = new://Resource?type=ContextService
+Foo.Propagated = Remaining
+Foo.Cleared = Transaction
+Foo.Unchanged = MyFoo
 ----
 
 === Configuration
-
-==== Prefix
-
-The thread prefix (suffixed with thread id).
-
-
-
-== ContextService
-
-A concurrency utilities for JavaEE context service. It allows to create
-contextual proxies (inheriting from security, classloader...contexts).
-
-Declarable in tomee.xml via
-
-[source,xml]
-----
-<Resource id="Foo" type="ContextService" />
-----
-
-Declarable in properties via
-
-[source,properties]
-----
-Foo = new://Resource?type=ContextService
-----
+==== Propagated, Cleared, Unchanged
+Contexts to be propagated, cleared or ignored.
+Propagating the built-in type 'Transaction' is not supported!
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatThreadContextListener.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatThreadContextListener.java
index 5fa0650b63..dd6af8a245 100644
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatThreadContextListener.java
+++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatThreadContextListener.java
@@ -73,7 +73,7 @@ public class TomcatThreadContextListener implements ThreadContextListener {
      * {@inheritDoc}
      */
     @Override
-    public void contextEntered(final ThreadContext oldContext, final ThreadContext newContext, final boolean propagateTx) {
+    public void contextEntered(final ThreadContext oldContext, final ThreadContext newContext) {
         // save off the old context if possible
         try {
             final Data data = new Data(getThreadName());