サーブレット内のプライベート・インスタンス変数がnullに設定されていますか?

私のサーブレットでは、バックグラウンドスレッド onContextInitialized()を開始します。したがって、 onContextDestroyed()を停止する必要があります。したがって、私のサーブレットは、このデーモンスレッドを指し示すプライベートインスタンス変数(このデーモンを呼ぶ)を必要とします。 デーモンは正​​常に動作しますが、 contextInitialized()を終了するとすぐに参照が失われます。たとえば、スレッドのステータスを表示するために doGet()を実装すると、NPEをスローします

答えは、誰が私のサーブレットプライベートインスタンス変数にアクセスしてnullに設定できるのでしょうか? 私は、スレッドがうまく動作し、ちょうど参照が壊れていると発言する

1
いいえ、contextInitialized()の実行後にサーブレットオブジェクトが破棄されたようです。理由を理解するのはかなり難しい..
追加された 著者 Raffaele,
onContextInitializedのコードを記述できますか?これはかなり独特のように聞こえる。 onContextInitializedに類似の名前のローカル変数を宣言しているため、インスタンス変数がシャドーされている可能性がありますか?
追加された 著者 Jonathan,

2 答え

すべてのインスタンスがそれを見ることができるように静的にします。

private static Thread daemon;
1
追加された
@ Raggaeleあなたが正しいです、それはほとんどのサーブレットコンテナでは必要ありません。可能であれば、あなたのコードを投稿してください。
追加された 著者 soulcheck,
AFAIKこれは必須ではありません。なぜなら、Tomcatはサーブレットを初期化してから、そのインスタンスオブジェクト
追加された 著者 Raffaele,
静的に設定すると、そのトリックになります。しかし、私は@ Jigar Joshiの回答を好んでいます。なぜなら、これは正式なdocの状態(ServletContext.setAttribute()の使用)なので、
追加された 著者 Raffaele,

アプリケーションコンテキストで参照を設定するか、またはそれをいくつかのクラスの静的フィールドに設定します。

あなたが達成したいことがわからないが

1
追加された
私は理解できませんしかし、contextInitialized()が呼び出された後にサーブレットオブジェクトがTomcatで破壊された理由を理解できません。その疑問を解決したい場合はコードを入れてください
追加された 著者 Jigar Joshi,
ありがとう、これはちょうどdocが言うものです:)
追加された 著者 Raffaele,
しかし、私はcontextInitialized()が呼び出された後にサーブレットオブジェクトがTomcatで破壊される理由を理解していません...
追加された 著者 Raffaele,
申し訳ありませんが、私は私のコードを投稿することができません。とにかくそれは非常に最小限です:ServletContextListenerを実装する単純なサーブレット
追加された 著者 Raffaele,