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());