Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [cu-dev] TCK test ContextServiceDefinitionServlet.testContextServiceDefinitionDefaults, ContextC

Nathan,

Thanks a lot!

:-)

Have a nice weekend!

Petr



On 3/31/22 21:59, Nathan Rauh wrote:

The intent of that test was to verify that the defaults defined by the specification/API/JavaDoc are used in the absence of explicit configuration.

Taking a look at ContextServiceDefinition, these are the defaults:

    String[] cleared() default { TRANSACTION };

    String[] unchanged() default {};

    String[] propagated() default { ALL_REMAINING };

 

* Does ALL_REMAINING mean also all custom thread context providers?

Yes. ALL_REMAINING is literally everything else, including all custom thread context providers, that are not configured elsewhere. The inclusion of custom thread context providers as part of “all” is assumed by the current JavaDoc and not explicitly called out.  I’d be happy add something explicit about it to be as clear and precise as possible – thanks for bringing this up!

* What should happen with the transaction, when used in cleared? The javadoc says: context to clear whenever a thread runs the contextual task or action. The thread's previous context is restored afterward.
The JavaDoc for the TRANSACTION constant states the following:
     A thread with a cleared transaction context can begin a new {@link jakarta.transaction.UserTransaction}.
This stated a bit indirectly in that in order to allow you to begin a new transaction when there is an existing transaction on the thread, the transaction would need to be suspended (and resumed afterward to restore context).  This has exactly the same meaning as the execution property ManagedTask.TRANSACTION=SUSPEND.  I’ll look into updating the JavaDoc to explicitly call this out as well.  Thanks again for identifying it.

** I tried to find this in the discussion in MicroProfile, but it didn't help. Does it mean, that the transaction should be suspended before executing the task in a different thread?
Yes, it’s not surprising that MicroProfile would have the same lack of clarity – a lot of this was copied over from MicroProfile.

 

From: cu-dev <cu-dev-bounces@xxxxxxxxxxx> on behalf of Petr Aubrecht <aubrecht@xxxxxxxxxxxx>
Reply-To: cu developer discussions <cu-dev@xxxxxxxxxxx>
Date: Thursday, March 31, 2022 at 2:20 PM
To: cu developer discussions <cu-dev@xxxxxxxxxxx>
Subject: [EXTERNAL] [cu-dev] TCK test ContextServiceDefinitionServlet.testContextServiceDefinitionDefaults, ContextC

 

Hello, I'm looging at the test ContextServiceDefinitionServlet.testContextServiceDefinitionDefaults. It uses ContextC. The code looks like this: @ContextServiceDefinition(name = "java:comp/concurrent/ContextC") ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ZjQcmQRYFpfptBannerStart

This Message Is From an External Sender

This message came from outside your organization.

ZjQcmQRYFpfptBannerEnd

Hello,

I'm looging at the test ContextServiceDefinitionServlet.testContextServiceDefinitionDefaults. It uses ContextC. The code looks like this:

@ContextServiceDefinition(name = "java:comp/concurrent/ContextC")

...

ContextService contextService = InitialContext.doLookup("java:comp/concurrent/ContextC");
StringContext.set("testContextServiceDefinitionDefaults-1");

Callable<String> callable = contextService.contextualCallable(() -> {
    ...
});

StringContext.set("testContextServiceDefinitionDefaults-2");

assertEquals(callable.call(), "testContextServiceDefinitionDefaults-1",
        "Third-party context type StringContext must be propagated to contextual Callable.");

assertEquals(tx.getStatus(), Status.STATUS_ACTIVE,
        "Transaction must be restored on thread after contextual proxy completes.");

There must be something I miss, because StringContext is not propagated. The definition with default values looks like this:

@ContextServiceDefinition(name = "java:comp/concurrent/ContextC", cleared=TRANSACTION, propagated=ALL_REMAINING, unchanged={})

* Does ALL_REMAINING mean also all custom thread context providers?

* What should happen with the transaction, when used in cleared? The javadoc says: context to clear whenever a thread runs the contextual task or action. The thread's previous context is restored afterward.

** I tried to find this in the discussion in MicroProfile, but it didn't help. Does it mean, that the transaction should be suspended before executing the task in a different thread?

 

Updating the definition this way improves things:

@ContextServiceDefinition(name = "java:comp/concurrent/ContextC", propagated = {ALL_REMAINING, StringContext.NAME}, cleared = {})

 

Thank you,

Petr


Back to the top