3

ここでJavaサーブレットについて話します...私は独自の「リクエストごとのコンテキスト」の作成に取り組んでおり、「リクエストごとのコンテキスト」オブジェクトをThread.currentThread()。getId()値に結び付けようとしていました。

このコンテキストオブジェクトをどこにでも渡す代わりに、ユーザーがリクエストごとに基づく関数を呼び出したときに現在のスレッドIDをチェックし、そのスレッドIDのハッシュテーブルからコンテキストオブジェクトを自動的に取得することを計画していました。

私はこのようなコードを使用します。

public void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException
{
    MyFramework.EnterContext();
    try {
        // do stuff here that leads to other classes on the same thread
        // Access current context via static MyFramework.getCurrentContext()
    }
    finally { MyFramework.ExitContext(); }
}

ただし、ExitContext()を呼び出さない潜在的なユーザーからアプリケーションを自動的に保護したいと思います。C#では、onexitのスレッドオブジェクトにイベントハンドラーがあります...(これについては間違っていると思います)スレッドが終了したときに検出またはポーリングする方法はありますか?現在、threadId(long)のみを保存しています。

何か案は?

4

2 に答える 2

1

A ThreadLocal seems to fit your use perfectly. A ThreadLocal object can provide a way to store a variable per thread. The internal workings of this class are very much of what you describe, it uses a map to give thread-local variables.

Something like this should do the trick:

private static final ThreadLocal<UserContext> userContext = new ThreadLocal<UserContext>();

public void doPost(HttpServletRequest request, HttpServletResponse response) 
              throws ServletException, IOException {
    MyFramework.EnterContext();
    try {
       UserContext context = userContext.get();
       //if you used the set method in this thread earlier
       //a thread local context would be returned using get
    }
    finally { MyFramework.ExitContext(); }
}

As for your other problem, you can use an observer pattern and notify when the thread completes its task.

于 2012-04-26T00:42:13.517 に答える
1

残念ながら、Javaのスレッドにはそのような機能は組み込まれていません。さらに、スレッドIDは常に一意であることが保証されていますが、スレッドが停止したときに最終的に再利用される可能性があります(ドキュメントから)。ただし、使用しているサーブレットフレームワークがそのような機能を実装している可能性があります(単なる推測)。

サーブレットフィルタを実装し、それをに含めるようにユーザーに指示することをお勧めしますweb.xml。これにより、クライアントコードが常にスレッドコンテキストで正しくラップされるようになります。

于 2012-04-26T00:49:46.930 に答える