Annotation Interface ContextServiceDefinition


@Repeatable(List.class) @Retention(RUNTIME) @Target(TYPE) public @interface ContextServiceDefinition

Defines a ContextService to be injected into ContextService injection points including any required Qualifier annotations specified by qualifiers() and registered in JNDI by the container under the JNDI name that is specified in the name() attribute.

Application components can refer to this JNDI name in the lookup attribute of a Resource annotation,

@ContextServiceDefinition(
     name = "java:app/concurrent/MyContext",
     qualifiers = MyQualifier.class,
     propagated = APPLICATION,
     unchanged = TRANSACTION,
     cleared = ALL_REMAINING)
 public class MyServlet extends HttpServlet {
     @Inject
     @MyQualifier
     ConetxtService appContextSvc1;

     @Resource(lookup = "java:app/concurrent/MyContext",
               name = "java:app/concurrent/env/MyContextRef")
     ContextService appContextSvc2;
     ...

 @Qualifier
 @Retention(RetentionPolicy.RUNTIME)
 @Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE })
 public @interface MyQualifier {}
 

Resource environment references in a deployment descriptor can similarly specify the lookup-name,

 <resource-env-ref>
    <resource-env-ref-name>java:app/env/concurrent/MyContextRef</resource-env-ref-name>
    <resource-env-ref-type>jakarta.enterprise.concurrent.ContextService</resource-env-ref-type>
    <lookup-name>java:app/concurrent/MyContext</lookup-name>
 </resource-env-ref>
 

The cleared(), propagated(), and unchanged() attributes enable the application to configure how thread context is applied to tasks and actions that are contextualized by the ContextService. Constants are provided on this class for context types that are defined by the Jakarta EE Concurrency specification. In addition to those constants, a Jakarta EE product provider may choose to accept additional vendor-specific context types. Usage of vendor-specific types will make applications non-portable.

Overlap of the same context type across multiple lists is an error and prevents the ContextService instance from being created. If ALL_REMAINING is not present in any of the lists, it is implicitly appended to the cleared() context types.

You can also define a ContextService with the <context-service> deployment descriptor element. For example,
 <context-service>
    <name>java:app/concurrent/MyContext</name>
    <cleared>Security</cleared>
    <cleared>Transaction</cleared>
    <propagated>Application</propagated>
    <unchanged>Remaining</unchanged>
 </context-service>
 
If a context-service and ContextServiceDefinition have the same name, their attributes are merged to define a single ContextService definition, with each attribute that is specified in the context-service deployment descriptor entry taking precedence over the corresponding attribute of the annotation. If any qualifier elements are specified, the set of qualifier elements replaces the qualifiers attribute of the annotation.
Since:
3.0
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    static @interface 
    Enables multiple ContextServiceDefinition annotations on the same type.
  • Required Element Summary

    Required Elements
    Modifier and Type
    Required Element
    Description
    JNDI name of the ContextService instance being defined.
  • Optional Element Summary

    Optional Elements
    Modifier and Type
    Optional Element
    Description
    Types of context to clear whenever a thread runs the contextual task or action.
    Types of context to capture from the requesting thread and propagate to a thread that runs the contextual task or action.
    Class<?>[]
    List of required qualifier annotations.
    Types of context that are left alone when a thread runs the contextual task or action.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final String
    All available thread context types that are not specified elsewhere.
    static final String
    Context pertaining to the application component or module, including its Jakarta EE namespace (such as java:comp/env/) and thread context class loader.
    static final String
    Context that controls the credentials that are associated with the thread, including the caller subject and invocation/RunAs subject.
    static final String
    Context that controls the transaction that is associated with the thread.
  • Field Details

    • ALL_REMAINING

      static final String ALL_REMAINING

      All available thread context types that are not specified elsewhere. This includes thread context types from custom ThreadContextProviders that are not specified elsewhere.

      For example, to define a ContextService that propagates SECURITY context, leaves TRANSACTION context alone, and clears every other context type:

      @ContextServiceDefinition(
           name = "java:module/concurrent/SecurityContext",
           propagated = SECURITY,
           unchanged = TRANSACTION,
           cleared = ALL_REMAINING)
       public class MyServlet extends HttpServlet ...
       
      See Also:
    • APPLICATION

      static final String APPLICATION

      Context pertaining to the application component or module, including its Jakarta EE namespace (such as java:comp/env/) and thread context class loader.

      A cleared application context means that the thread is not associated with any application component and lacks access to the Jakarta EE namespace and thread context class loader of the application.

      See Also:
    • SECURITY

      static final String SECURITY

      Context that controls the credentials that are associated with the thread, including the caller subject and invocation/RunAs subject.

      A cleared security context gives the thread unauthenticated subjects.

      See Also:
    • TRANSACTION

      static final String TRANSACTION

      Context that controls the transaction that is associated with the thread.

      When cleared transaction context is applied to a thread, any global transaction that was previously present there is first suspended such that the contextual task or action can begin and manage, as permitted by the container, its own new jakarta.transaction.UserTransaction. After the contextual task or action completes, the prior transaction is resumed on the thread. This is equivalent to the execution property, ManagedTask.TRANSACTION with a value of ManagedTask.SUSPEND.

      The execution property, ManagedTask.TRANSACTION, if specified, takes precedence over the behavior for transaction context that is specified on the resource definition annotations.

      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.

      See Also:
  • Element Details

    • name

      String name

      JNDI name of the ContextService instance being defined. The JNDI name must be in a valid Jakarta EE namespace, such as,

      • java:comp
      • java:module
      • java:app
      • java:global
      Returns:
      ContextService JNDI name.
    • qualifiers

      Class<?>[] qualifiers

      List of required qualifier annotations.

      A ContextService injection point with these qualifier annotations injects a bean that is produced by this ContextServiceDefinition.

      The default value is an empty list, indicating that this ContextServiceDefinition does not automatically produce bean instances for any injection points.

      When the qualifiers list is non-empty, the container creates a ContextService instance and registers an ApplicationScoped bean for it with the specified required qualifiers and required type of ContextService. The life cycle of the bean aligns with the life cycle of the application and the bean is not accessible from outside of the application. Applications must not configure a java:global name if also configuring a non-empty list of qualifiers.

      Applications can define their own Producers for ContextService injection points as long as the qualifier annotations on the producer do not conflict with the non-empty qualifiers() list of a ContextServiceDefinition.

      Returns:
      list of qualifiers.
      Since:
      3.1
      Default:
      {}
    • cleared

      String[] cleared

      Types of context to clear whenever a thread runs the contextual task or action. The thread's previous context is restored afterward.

      Constants are provided on this class for the context types that are defined by the Jakarta EE Concurrency specification.

      Returns:
      context types to clear.
      Default:
      {"Transaction"}
    • propagated

      String[] propagated

      Types of context to capture from the requesting thread and propagate to a thread that runs the contextual task or action. The captured context is re-established when threads run the contextual task or action, with the respective thread's previous context being restored afterward.

      Constants are provided on this class for the context types that are defined by the Jakarta EE Concurrency specification.

      Returns:
      context types to capture and propagate.
      Default:
      {"Remaining"}
    • unchanged

      String[] unchanged

      Types of context that are left alone when a thread runs the contextual task or action.

      For example, with unchanged = TRANSACTION if a transaction is started after a function is contextualized, but before the function is run on the same thread, the transaction will be active in the contextual function:

      Consumer<String, Integer> updateDB = contextService.contextualConsumer(fn);
      
      // later, on another thread
      tx.begin();
      updateDB.accept("java:comp/env/jdbc/ds1");
      //...additional transactional work
      tx.commit();

      Constants are provided on this class for the context types that are defined by the Jakarta EE Concurrency specification.

      Returns:
      context types to leave unchanged.
      Default:
      {}