Hey David,

sorry for replying a bit late, but I haven't touched concurrency in basically a year and our use-case for it is pretty basic I have to admit. So I also need to skim through the spec to understand why I built things this way.

First of all I commented on the PR that caused all of this (https://github.com/apache/tomee/pull/1996#issuecomment-3130863438). Reading through your messages what I did actually makes a lot of sense; begin a _new_ ThreadContext and when the Concurrency Context ends exit it and restore the old ThreadContext if there was one. So IMO this looks good.


I think the interesting part right now is in the ContextService part of the Concurrency Spec, as everything else like Managed Threads, Managed (Scheduled) Executor service, etc. depends on it and is IIRC just some sugar coating on top of the ContextService to not invoke it manually in tasks. Here the spec knows of 3 different types of Contexts that can be cleared/ignored/propagated: Application, Security and Transaction. Application/Security was basically there before I started working on concurrency (except for the ThreadContext enter/exit in ApplicationThreadContextProvider)  but TxThreadContextProvider was empty, so I naturally started implementing it to pass the TCK.

Interestingly enough reading through relevant spec/javadocs again I found:
- in §2.3: "The types of contexts to be propagated from a contextualizing application component include JNDI n aming context, classloader, and security information. Containers must support propagation of these context types. In addition, containers can choose to support propagation of other types of context." -> sounds like Transaction propagation not being a requirement - in §3.3.5 "By default, proxy methods suspend any transactional context on the thread and allow components to manually control global transaction demarcation boundaries. Context objects may optionally begin, commit, and rollback a transaction. See EE.4 for details on transaction management in Jakarta EE. By using an execution property when creating the contextual proxy object, application components can choose to not suspend the transactional context on the thread, and any resources used by the task will be enlisted to that transaction." - @ContextServiceDefinition javadoc: "Jakarta EE providers need not support the propagation of transactions to other threads and can reject resource definition annotations that include transaction as a propagated context."
- There is also https://github.com/jakartaee/concurrency/issues/102


This all sounds to me like implementing TxThreadContextProvider#currentContext was straight up wrong and we must delete it alongside the propagateTx flag Jon introduced and reject ContextService resources that have propagated*=TRANSACTION, that should clear things up a lot I think.


@Jon, maybe you also have some thoughts on this?


Thanks

Markus


On 31.07.25 00:47, David Blevins wrote:
On Jul 30, 2025, at 3:45 PM, David Blevins <david.blev...@gmail.com> wrote:

A good chunk of these requirements appear to come from the Jakarta Concurrency 
spec.  I've not read that one yet and don't have the bandwidth to become an 
expert in it and the TCK requirements.

Markus & Jon, any chance you'd want to give an overview of what features the 
TCK is specifically requesting we implement?
And specifically what stuff needs to be propagated to the threads it spawns.  
That's really the key part.


-David



Reply via email to