私の Web アプリは (埋め込まれた) Jetty 9 に基づいています。Jetty内で(つまり *.war ファイルから) 実行されるコードは、時々、HTTP 要求を実行して Jetty とそれ自体に戻す必要があります。 " ネットワークからの HTTP リクエスト。
あなたの言うことはわかりますが、これは私が複数の異なる製品を 1 つのコンテナーにマージした後にたどり着いた状況であり、現在それを避けることはできません。一時しのぎの措置が講じられています。実際には、ネットワーク HTTP リクエストを自分自身に送り返します (現在は Jetty クライアントを使用していますが、それは問題ではありません)。ただし、これによりオーバーヘッドが増えるだけでなく、リクエスト属性などを介して渡したい実際のオブジェクト参照を渡すこともできません。
望ましいのは、新しい HttpServletRequest と HttpServletResponse のペアを作成し、ディスパッチャーを使用して、現在ネットワーク経由でしかアクセスできない他のサーブレットを「含める」(または同様の) ことができるようにすることです。これらの「ダミー」実装を構築しましたが、これは Jetty のディスパッチャー 120 行目でヌル ポインター例外で失敗します。
public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException
{
Request baseRequest=(request instanceof Request)?((Request)request):HttpChannel.getCurrentHttpChannel().getRequest();
...これはJetty の Request クラスのインスタンスではなく、 getCurrentHttpChannel() が null を返すためです。これは、スレッドがワーカー スレッドであり、http サービスを提供するスレッドではなく、Jetty のスレッド ローカルが設定されていないためです。
いろいろ検討中ですが、どなたか教えていただけると助かります。私が考えているいくつかのこと:
- 実際には Jetty の Request クラスをベースとして使用します。現在、Web アプリには表示されません (コンテナー クラスは、おそらくクラスパスとクラス ローダーを操作する必要があります。まだ不可能かもしれません (そこに何が期待できるかわかりません)。
- Jetty のスレッド ローカルで遊んで、必要に応じて現在のスレッドをセットアップするように Jetty に指示してみてください。どこから始めればよいかわかりません。UPDATE setServerClasses([]) を試行し、現在の HttpChannel を別のスレッドから「盗んだ」ものに設定しようとしました。ひどく失敗しました: java.lang.IllegalAccessError: クラスからメソッド org.eclipse.jetty.server.HttpChannel.setCurrentHttpChannel(Lorg/eclipse/jetty/server/HttpChannel;)V にアクセスしようとしました ...
- 理想的には、ネットワークを介さずに「トップ」リクエストを送信するより適切な方法を見つけてください。同じスレッドで実行するのが理想的ですが、私はそれほど気にしません。
残念ながら、現時点ではこれを避けることはできません。コードを直接呼び出したいのですが、追加しなければならなかったコードが大きすぎて現時点では処理できず、変更もできないサードパーティのフィルターに依存しすぎているため (フィルターとしてのみ機能し、実際のリクエストに応じて)。
助けてください!