インターフェース ContextService
public interface ContextServiceContextService は、動的プロキシオブジェクト (java.lang.reflect.ProxySE で定義) を作成するためのメソッドを提供します。ContextService は、完了段階のアクションとして使用できる関数インターフェース (FunctionSE など) のプロキシオブジェクトも作成します。プロキシオブジェクトは、通常、Jakarta™ EE 環境で実行されるアプリケーションに関連付けられたコンテキストを追加して実行されます。このようなコンテキストの例は、クラスローディング、名前空間、セキュリティなどです。プロキシオブジェクトは、
java.lang.reflect.ProxySE クラスに対して定義されたものと同じ規則に従いますが、以下の追加があります。- プロキシインスタンスは、作成者のスレッドのコンテキストを保持します。
- プロキシインスタンスは、
createContextualProxyメソッドで指定されたすべてのインターフェースを実装します。 - プロキシインスタンスを作成するオブジェクトは、Web コンポーネントや Jakarta Enterprise Bean など、Jakarta EE Product Provider によって管理されるコンポーネントであってはなりません。
hashCode、equals、toStringと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
メソッドのサマリー
すべてのメソッド インスタンスメソッド 抽象メソッド 修飾子と型 メソッド 説明 <R> CallableSE<R>contextualCallable(CallableSE<R> callable)contextualCallableを呼び出すスレッドからキャプチャーされたコンテキストでCallableSE をラップします。<T,U>
BiConsumerSE<T,U>contextualConsumer(BiConsumerSE<T,U> consumer)contextualConsumerを呼び出すスレッドからキャプチャーされたコンテキストでBiConsumerSE をラップします。<T> ConsumerSE<T>contextualConsumer(ConsumerSE<T> consumer)contextualConsumerを呼び出すスレッドからキャプチャーされたコンテキストでConsumerSE をラップします。<T,U,R>
BiFunctionSE<T,U,R>contextualFunction(BiFunctionSE<T,U,R> function)contextualFunctionを呼び出すスレッドからキャプチャーされたコンテキストでBiFunctionSE をラップします。<T,R>
FunctionSE<T,R>contextualFunction(FunctionSE<T,R> function)contextualFunctionを呼び出すスレッドからキャプチャーされたコンテキストでBiFunctionSE をラップします。RunnableSEcontextualRunnable(RunnableSE runnable)contextualRunnableを呼び出すスレッドからキャプチャーされたコンテキストでRunnableSE をラップします。<R> SupplierSE<R>contextualSupplier(SupplierSE<R> supplier)contextualSupplierを呼び出すスレッドから取得したコンテキストでSupplierSE をラップします。ObjectSEcreateContextualProxy(ObjectSE instance, ClassSE<?>... interfaces)入力オブジェクトインスタンスの新しいコンテキストオブジェクトプロキシを作成します。ObjectSEcreateContextualProxy(ObjectSE instance, MapSE<StringSE,StringSE> executionProperties, ClassSE<?>... interfaces)入力オブジェクトインスタンスの新しいコンテキストオブジェクトプロキシを作成します。<T> TcreateContextualProxy(T instance, ClassSE<T> intf)入力オブジェクトインスタンスの新しいコンテキストオブジェクトプロキシを作成します。<T> TcreateContextualProxy(T instance, MapSE<StringSE,StringSE> executionProperties, ClassSE<T> intf)入力オブジェクトインスタンスの新しいコンテキストオブジェクトプロキシを作成します。ExecutorSEcurrentContextExecutor()executeが呼び出された同じスレッドでタスクを実行するExecutorSE としてスレッドコンテキストをキャプチャーしますが、currentContextExecutorを呼び出すスレッドからキャプチャーされたコンテキストを使用します。MapSE<StringSE,StringSE>getExecutionProperties(ObjectSE contextualProxy)コンテキストプロキシインスタンスの現在の実行プロパティを取得します。<T> CompletableFutureSE<T>withContextCapture(CompletableFutureSE<T> stage)指定されたステージの完了によって完了する新しいCompletableFutureSE を返します。<T> CompletionStageSE<T>withContextCapture(CompletionStageSE<T> stage)指定されたステージの完了によって完了する新しいCompletionStageSE を返します。
メソッドの詳細
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