インターフェース ContextService


  • public interface ContextService
    ContextService は、動的プロキシオブジェクト ( java.lang.reflect.ProxySE で定義) を作成するためのメソッドを提供します。ContextService は、完了段階のアクションとして使用できる関数インターフェース ( FunctionSE など) のプロキシオブジェクトも作成します。プロキシオブジェクトは、通常、Jakarta™ EE 環境で実行されるアプリケーションに関連付けられたコンテキストを追加して実行されます。このようなコンテキストの例は、クラスローディング、名前空間、セキュリティなどです。

    プロキシオブジェクトは、java.lang.reflect.ProxySE クラスに対して定義されたものと同じ規則に従いますが、以下の追加があります。

    • プロキシインスタンスは、作成者のスレッドのコンテキストを保持します。
    • プロキシインスタンスは、createContextualProxy メソッドで指定されたすべてのインターフェースを実装します。
    • プロキシインスタンスを作成するオブジェクトは、Web コンポーネントや Jakarta Enterprise Bean など、Jakarta EE Product Provider によって管理されるコンポーネントであってはなりません。
    • hashCodeequalstoString と ObjectSE で宣言された他のすべてのメソッドを除いて、プロキシインスタンスでのすべてのインターフェースメソッドの呼び出しは、作成者のコンテキストで実行されます。
    • プロキシされたオブジェクトインスタンスがシリアライズ可能である場合、プロキシインスタンスは SerializableSE を実装する必要があります。
    • プロキシインスタンスが直列化されている場合、プロキシオブジェクトインスタンスは SerializableSE を実装する必要があります。
    • 実行プロパティは、プロキシインスタンスとともに保存できます。カスタムプロパティキーは "jakarta.enterprise.concurrent." で始まってはなりません。
    • 実行プロパティは、さまざまなコンテキスト情報を取得してスレッドに適用する方法を制御するために使用されます。アプリケーションコンポーネントは任意のプロパティキーと値を格納できますが、お勧めしません。Jakarta EE 製品プロバイダーは、キーと値のサイズに制限を課す場合があります。

    例: アプリケーションコンポーネントの名前空間にアクセスできるように、単一の完了ステージアクションを文脈化します。

     contextSvc = InitialContext.doLookup("java:comp/DefaultContextService");
     stage2 = stage1.thenApply(contextSvc.contextualFunction(i -> {
         DataSource ds = InitialContext.doLookup("java:comp/env/dsRef");
         try (Connection con = ds.getConnection()) {
             PreparedStatement stmt = con.prepareStatement(sql);
             stmt.setInt(1, i);
             ResultSet result = stmt.executeQuery();
             return result.next() ? result.getInt(1) : 0;
         }
     }));
     

    導入:
    1.0
    • メソッドの詳細

      • contextualCallable

        <R> CallableSE<R> contextualCallable​(CallableSE<R> callable)

        contextualCallable を呼び出すスレッドからキャプチャーされたコンテキストで CallableSE をラップします。コンテキストは、contextualCallable が呼び出された時点でキャプチャーされます。

        プロキシインスタンスで call が呼び出されると、最初に call メソッドを実行するスレッドでコンテキストが確立され、次に、提供された Callable の call メソッドが呼び出されます。最後に、前のコンテキストがスレッドに復元され、Callable の結果が呼び出し元に返されます。

        型パラメーター:
        R - 呼び出し可能な結果の型。
        パラメーター:
        callable - コンテキスト化するインスタンス。
        戻り値:
        call メソッドの実行をコンテキストでラップするコンテキスト化されたプロキシインスタンス。
        例外:
        IllegalArgumentExceptionSE - すでにコンテキスト化された Callable がこのメソッドに提供されている場合。
        導入:
        3.0
      • contextualConsumer

        <T,​U> BiConsumerSE<T,​U> contextualConsumer​(BiConsumerSE<T,​U> consumer)

        contextualConsumer を呼び出すスレッドからキャプチャーされたコンテキストで BiConsumerSE をラップします。コンテキストは、contextualConsumer が呼び出された時点でキャプチャーされます。

        プロキシインスタンスで accept が呼び出されると、最初に accept メソッドを実行するスレッドでコンテキストが確立され、次に、提供された BiConsumer の accept メソッドが呼び出されます。最後に、以前のコンテキストがスレッドに復元され、制御が呼び出し側に返されます。

        型パラメーター:
        T - コンシューマーへの最初のパラメーターの型。
        U - コンシューマーへの 2 番目のパラメーターの型。
        パラメーター:
        consumer - コンテキスト化するインスタンス。
        戻り値:
        accept メソッドの実行をコンテキストでラップするコンテキスト化されたプロキシインスタンス。
        例外:
        IllegalArgumentExceptionSE - すでにコンテキスト化された BiConsumer がこのメソッドに提供されている場合。
        導入:
        3.0
      • contextualConsumer

        <T> ConsumerSE<T> contextualConsumer​(ConsumerSE<T> consumer)

        contextualConsumer を呼び出すスレッドからキャプチャーされたコンテキストで ConsumerSE をラップします。コンテキストは、contextualConsumer が呼び出された時点でキャプチャーされます。

        プロキシインスタンスで accept が呼び出されると、最初に accept メソッドを実行するスレッドでコンテキストが確立され、次に、提供された Consumer の accept メソッドが呼び出されます。最後に、以前のコンテキストがスレッドに復元され、制御が呼び出し側に返されます。

        型パラメーター:
        T - コンシューマーへのパラメーターの型。
        パラメーター:
        consumer - コンテキスト化するインスタンス。
        戻り値:
        accept メソッドの実行をコンテキストでラップするコンテキスト化されたプロキシインスタンス。
        例外:
        IllegalArgumentExceptionSE - すでにコンテキスト化された Consumer がこのメソッドに提供されている場合。
        導入:
        3.0
      • contextualFunction

        <T,​U,​R> BiFunctionSE<T,​U,​R> contextualFunction​(BiFunctionSE<T,​U,​R> function)

        contextualFunction を呼び出すスレッドからキャプチャーされたコンテキストで BiFunctionSE をラップします。コンテキストは、contextualFunction が呼び出された時点でキャプチャーされます。

        プロキシインスタンスで apply が呼び出されると、最初に apply メソッドを実行するスレッドでコンテキストが確立され、次に、提供された BiFunction の apply メソッドが呼び出されます。最後に、前のコンテキストがスレッドに復元され、BiFunction の結果が呼び出し元に返されます。

        型パラメーター:
        T - 機能する最初のパラメーターの型。
        U - 機能する 2 番目のパラメーターの型。
        R - 関数の結果の型。
        パラメーター:
        function - コンテキスト化するインスタンス。
        戻り値:
        apply メソッドの実行をコンテキストでラップするコンテキスト化されたプロキシインスタンス。
        例外:
        IllegalArgumentExceptionSE - すでにコンテキスト化された BiFunction がこのメソッドに提供されている場合。
        導入:
        3.0
      • contextualFunction

        <T,​R> FunctionSE<T,​R> contextualFunction​(FunctionSE<T,​R> function)

        contextualFunction を呼び出すスレッドからキャプチャーされたコンテキストで BiFunctionSE をラップします。コンテキストは、contextualFunction が呼び出された時点でキャプチャーされます。

        プロキシインスタンスで apply が呼び出されると、最初に apply メソッドを実行するスレッドでコンテキストが確立され、次に、提供された Function の apply メソッドが呼び出されます。最後に、前のコンテキストがスレッドに復元され、Function の結果が呼び出し元に返されます。

        型パラメーター:
        T - 機能するパラメーターの型。
        R - 関数の結果の型。
        パラメーター:
        function - コンテキスト化するインスタンス。
        戻り値:
        apply メソッドの実行をコンテキストでラップするコンテキスト化されたプロキシインスタンス。
        例外:
        IllegalArgumentExceptionSE - すでにコンテキスト化された Function がこのメソッドに提供されている場合。
        導入:
        3.0
      • contextualRunnable

        RunnableSE contextualRunnable​(RunnableSE runnable)

        contextualRunnable を呼び出すスレッドからキャプチャーされたコンテキストで RunnableSE をラップします。コンテキストは、contextualRunnable が呼び出された時点でキャプチャーされます。

        プロキシインスタンスで run が呼び出されると、最初に run メソッドを実行するスレッドでコンテキストが確立され、次に、提供された Runnable の run メソッドが呼び出されます。最後に、以前のコンテキストがスレッドに復元され、制御が呼び出し側に返されます。

        パラメーター:
        runnable - コンテキスト化するインスタンス。
        戻り値:
        run メソッドの実行をコンテキストでラップするコンテキスト化されたプロキシインスタンス。
        例外:
        IllegalArgumentExceptionSE - すでにコンテキスト化された Runnable がこのメソッドに提供されている場合。
        導入:
        3.0
      • contextualSupplier

        <R> SupplierSE<R> contextualSupplier​(SupplierSE<R> supplier)

        contextualSupplier を呼び出すスレッドから取得したコンテキストで SupplierSE をラップします。コンテキストは、contextualSupplier が呼び出された時点でキャプチャーされます。

        プロキシインスタンスで supply が呼び出されると、最初に supply メソッドを実行するスレッドでコンテキストが確立され、次に、提供された Supplier の supply メソッドが呼び出されます。最後に、前のコンテキストがスレッドに復元され、Supplier の結果が呼び出し元に返されます。

        型パラメーター:
        R - サプライヤーの結果型。
        パラメーター:
        supplier - コンテキスト化するインスタンス。
        戻り値:
        supply メソッドの実行をコンテキストでラップするコンテキスト化されたプロキシインスタンス。
        例外:
        IllegalArgumentExceptionSE - すでにコンテキスト化された Supplier がこのメソッドに提供されている場合。
        導入:
        3.0
      • createContextualProxy

        <T> T createContextualProxy​(T instance,
                                    ClassSE<T> intf)
        入力オブジェクトインスタンスの新しいコンテキストオブジェクトプロキシを作成します。

        各メソッド呼び出しには、コンテキストオブジェクトプロキシを作成したアプリケーションコンポーネントインスタンスのコンテキストがあります。

        コンテキストオブジェクトは、Java™ の開発または使用時に役立ちます。イベントを他のコンポーネントインスタンスに伝播する SE スレッドメカニズム。

        プロキシを作成したアプリケーションコンポーネントが起動またはデプロイされていない場合、リフレクトされたインターフェースのすべてのメソッドが IllegalStateExceptionSE をスローする場合があります。

        例: Java™ を使用して、作成者のコンテキストでコンテキスト化された Runnable を実行します。SE ExecutorService:

          public class MyRunnable implements Runnable {
              public void run() {
                  System.out.println("MyRunnable.run with Jakarta EE Context available.");
              }
          }
        
          InitialContext ctx = new InitialContext();
          ThreadFactory threadFactory = (ThreadFactory) ctx
                   .lookup("java:comp/env/concurrent/ThreadFactory");
        
          ContextService ctxService = (ContextService) ctx
                   .lookup("java:comp/env/concurrent/ContextService");
        
          MyRunnable myRunnableInstance = ...;
        
          Runnable rProxy = ctxService.createContextualProxy(myRunnableInstance, Runnable.class);
        
          ExecutorService exSvc = Executors.newThreadPool(10, threadFactory);
        
          Future f = exSvc.submit(rProxy);
         

        型パラメーター:
        T - プロキシするインスタンスの型
        パラメーター:
        instance - プロキシするオブジェクトのインスタンス。
        intf - プロキシが実装する必要のあるインターフェース。
        戻り値:
        指定されたインターフェースを実装する入力オブジェクトのプロキシ。
        例外:
        IllegalArgumentExceptionSE - - intf 引数が null であるか、インスタンスが指定されたインターフェースを実装していない場合。
        UnsupportedOperationExceptionSE - - intf インターフェースが serializableSE であるが、スレッドコンテキスト型が直列化をサポートしていない場合。
      • createContextualProxy

        ObjectSE createContextualProxy​(ObjectSE instance,
                                     ClassSE<?>... interfaces)
        入力オブジェクトインスタンスの新しいコンテキストオブジェクトプロキシを作成します。

        このメソッドは、<T> T createContextualProxy(T instance, Class<T> intf) に似ていますが、プロキシが複数のインターフェースをサポートする必要がある場合にこのメソッドを使用できる点が異なります。

        例:
          public class MyRunnableWork implements Runnable, SomeWorkInterface {
              public void run() {
                  System.out.println("MyRunnableWork.run with Jakarta EE Context available.");
              }
              public void someWorkInterfaceMethod() {
                  ...
              }
          }
        
          ThreadFactory threadFactory = ...;
        
          ContextService ctxService = ...;
        
          MyRunnableWork myRunnableWorkInstance = ...;
        
          Object proxy = ctxService.createContextualProxy(myRunnableWorkInstance,
                                           Runnable.class, SomeWorkInterface.class);
        
          // call SomeWorkInterface method on the proxy
          ((SomeWorkInterface) proxy).someWorkInterfaceMethod();
        
          ExecutorService exSvc = Executors.newThreadPool(10, threadFactory);
        
          // submit the proxy as a Runnable to the ExecutorService
          Future f = exSvc.submit( (Runnable)proxy);
         
        パラメーター:
        instance - プロキシするオブジェクトのインスタンス。
        interfaces - プロキシが実装する必要のあるインターフェース。
        戻り値:
        指定されたすべてのインターフェースを実装する入力オブジェクトのプロキシ。
        例外:
        IllegalArgumentExceptionSE - - interfaces 引数が null であるか、インスタンスが指定されたすべてのインターフェースを実装していない場合。
        UnsupportedOperationExceptionSE - - interfaces のいずれかが serializableSE であるが、スレッドコンテキスト型が直列化をサポートしていない場合。
      • createContextualProxy

        <T> T createContextualProxy​(T instance,
                                    MapSE<StringSE,​StringSE> executionProperties,
                                    ClassSE<T> intf)
        入力オブジェクトインスタンスの新しいコンテキストオブジェクトプロキシを作成します。

        コンテキストオブジェクトは、Java™ の開発または使用時に役立ちます。イベントを他のコンポーネントインスタンスに伝播する SE スレッドメカニズム。

        プロキシを作成したアプリケーションコンポーネントが起動またはデプロイされていない場合、リフレクトされたインターフェースのすべてのメソッドが IllegalStateExceptionSE をスローする場合があります。

        このメソッドは、Map オブジェクトを受け入れます。これにより、コンテキストオブジェクトの作成者は、コンテキストオブジェクトの作成時にキャプチャーするコンテキストまたは動作を定義できます。指定されたプロパティは、コンテキストオブジェクトとともに残ります。

        例: MDB のトランザクション内で、送信者のコンテキストを使用してメッセージ駆動型 Bean(MDB)を呼び出すには:

         public class MyServlet ... {
             public void doPost() throws NamingException, JMSException {
                InitialContext ctx = new InitialContext();
        
                // Get the ContextService that only propagates
                // security context.
                ContextService ctxSvc = (ContextService)
                    ctx.lookup("java:comp/env/SecurityContext");
        
                // Set any custom context data through execution properties
                Map<String, String> execProps = new HashMap<>();
                execProps.put("vendor_a.security.tokenexpiration", "15000");
                // Specify that contextual object should run inside the current
                // transaction.  If we have a failure, we don't want to consume
                // the message.
                execProps.put(ManagedTask.TRANSACTION, "USE_TRANSACTION_OF_EXECUTION_THREAD");
        
                ProcessMessage msgProcessor =
                    ctxSvc.createContextualProxy(new MessageProcessor(), execProps,
                    ProcessMessage.class);
        
                ConnectionFactory cf = (ConnectionFactory)
                     ctx.lookup("java:comp/env/MyTopicConnectionFactory");
                Destination dest = (Destination) ctx.lookup("java:comp/env/MyTopic");
                Connection con = cf.createConnection();
        
                Session session = con.createSession(true, Session.AUTO_ACKNOWLEDGE);
                MessageProducer producer = session.createProducer(dest);
        
                Message msg = session.createObjectMessage((Serializable)msgProcessor);
                producer.send(dest, msg);
                ...
        
            }
        
          public class MyMDB ... {
            public void onMessage(Message msg) {
                // Get the ProcessMessage contextual object from the message.
                ObjectMessage omsg = (ObjectMessage)msg;
                ProcessMessage msgProcessor = (ProcessMessage)omsg.getObject();
        
                // Process the message in the specified context.
                msgProcessor.processMessage(msg);
            }
          }
        
          public interface  ProcessMessage {
              public void processMessage(Message msg);
          }
        
          public class MessageProcessor implements ProcessMessage, Serializable {
              public void processMessage(Message msg) {
                  // Process the message with the application container
                  // context that sent the message.
        
              }
          }
        
        型パラメーター:
        T - インターフェースの型
        パラメーター:
        instance - プロキシするオブジェクトのインスタンス。
        executionProperties - コンテキストオブジェクトを作成して実行するときに使用するプロパティ。
        intf - プロキシが実装する必要のあるインターフェース。
        戻り値:
        指定されたインターフェースを実装する入力オブジェクトのプロキシ。
        例外:
        IllegalArgumentExceptionSE - - intf 引数が null の場合、またはインスタンスが指定されたインターフェースを実装していない場合
        UnsupportedOperationExceptionSE - - intf インターフェースが serializableSE であるが、スレッドコンテキスト型が直列化をサポートしていない場合。
      • createContextualProxy

        ObjectSE createContextualProxy​(ObjectSE instance,
                                     MapSE<StringSE,​StringSE> executionProperties,
                                     ClassSE<?>... interfaces)
        入力オブジェクトインスタンスの新しいコンテキストオブジェクトプロキシを作成します。

        このメソッドは、<T> T createContextualProxy(T instance, Map<String, String> executionProperties, Class<T> intf) に似ていますが、プロキシが複数のインターフェースをサポートする必要がある場合にこのメソッドを使用できる点が異なります。

        パラメーター:
        instance - プロキシするオブジェクトのインスタンス。
        executionProperties - コンテキストオブジェクトを作成して実行するときに使用するプロパティ。
        interfaces - プロキシが実装する必要のあるインターフェース。
        戻り値:
        指定されたすべてのインターフェースを実装する入力オブジェクトのプロキシ。
        例外:
        IllegalArgumentExceptionSE - - interfaces 引数が null であるか、インスタンスが指定されたすべてのインターフェースを実装していない場合。
        UnsupportedOperationExceptionSE - - interfaces のいずれかが serializableSE であるが、スレッドコンテキスト型が直列化をサポートしていない場合。
      • currentContextExecutor

        ExecutorSE currentContextExecutor()

        execute が呼び出された同じスレッドでタスクを実行する ExecutorSE としてスレッドコンテキストをキャプチャーしますが、currentContextExecutor を呼び出すスレッドからキャプチャーされたコンテキストを使用します。

        使用例:

         Executor contextSnapshot = contextSvc.currentContextExecutor();
         ...
         // from another thread, or after thread context has changed,
         contextSnapshot.execute(() -> obj.doSomethingThatNeedsContext());
         contextSnapshot.execute(() -> doSomethingElseThatNeedsContext(x, y));
         

        すでにコンテキスト化された Runnable がその execute メソッドに提供されている場合、返された Executor は IllegalArgumentException を発生させる必要があります。

        戻り値:
        execute メソッドをコンテキストでラップするエグゼキュータ。
        導入:
        3.0
      • getExecutionProperties

        MapSE<StringSE,​StringSE> getExecutionProperties​(ObjectSE contextualProxy)
        コンテキストプロキシインスタンスの現在の実行プロパティを取得します。
        パラメーター:
        contextualProxy - 実行プロパティを取得するためのコンテキストプロキシインスタンス。
        戻り値:
        現在のコンテキストオブジェクト実行プロパティのコピー。実行プロパティを指定せずに contextualProxy が作成された場合は null になります。
        例外:
        IllegalArgumentExceptionSE - 入力 contextualProxy が createContextualProxy メソッドで作成された有効なコンテキストオブジェクトプロキシでない場合にスローされます。
      • withContextCapture

        <T> CompletableFutureSE<T> withContextCapture​(CompletableFutureSE<T> stage)

        指定されたステージの完了によって完了する新しい CompletableFutureSE を返します。

        この ContextService が ManagedExecutorService.getContextService() によって取得された場合、同じ ManagedExecutorService を使用して、新しい完了可能フューチャは、この ContextService からデフォルトの非同期実行機能を取得します。

        依存ステージが新しい完了可能な未来から作成され、それらのステージの依存ステージなどから作成されると、スレッドコンテキストが ContextService によってキャプチャーおよび / またはクリアされます。これにより、ユーザーが事前にコンテキスト化されたアクションを指定して明示的にオーバーライドしない限り、各ステージで実行されるアクションは常に、ステージを作成するコードのスレッドコンテキストで実行されることが保証されます。

        このメソッドの呼び出しは、最初に提供された完了可能なフューチャ、またはそれから直接作成された (このメソッドを使用しない) 他の依存ステージのスレッドコンテキストの伝播には影響しません。

        型パラメーター:
        T - 完了可能な将来の結果型。
        パラメーター:
        stage - その完了が、このメソッドによって作成された新しい完了可能なフューチャーの完了をトリガーする、完了可能なフューチャー。
        戻り値:
        新しい完全な未来。
        導入:
        3.0
      • withContextCapture

        <T> CompletionStageSE<T> withContextCapture​(CompletionStageSE<T> stage)

        指定されたステージの完了によって完了する新しい CompletionStageSE を返します。

        新しい完了ステージは、この ContextService からデフォルトの非同期実行機能を取得します。この ContextService が ManagedExecutorService.getContextService() によって取得された場合は同じ ManagedExecutorService を使用し、それ以外の場合は DefaultManagedExecutorService を使用します。

        依存ステージが新しい完了ステージから作成され、それらのステージの依存ステージなどから作成されると、スレッドコンテキストが ContextService によってキャプチャーおよび / またはクリアされます。これにより、ユーザーが事前にコンテキスト化されたアクションを指定して明示的にオーバーライドしない限り、各ステージで実行されるアクションは常に、ステージを作成するコードのスレッドコンテキストで実行されることが保証されます。

        このメソッドの呼び出しは、最初に提供されたステージ、またはそこから直接作成された他の依存ステージ (このメソッドを使用しない) のスレッドコンテキストの伝播には影響しません。

        型パラメーター:
        T - 完了段階の結果型。
        パラメーター:
        stage - このメソッドによって作成された新しいステージの完了をトリガーする完了ステージ。
        戻り値:
        新しい完成段階。
        導入:
        3.0