プラグイン アーキテクチャを使用する Java Web アプリケーションがあります。Webアプリの実行中にサーブレットをservletconfigにマッピングして、サーブレットを追加できるソリューションを誰かが持っているかどうか知りたいですか? クラスを /WEB-INF/classes フォルダーに追加し、Web アプリを再起動せずにサーブレットとしてアクティブにできるという考えです。同様に、ユーザーが「プラグイン」を削除することを選択した場合は、コードで servletconfig からクラスを削除します。
3 に答える
これを実現する標準のサーブレット API はありません。
これは Tomcat で行うことができます。ContainerServlet
Web アプリケーションでは、オブジェクトを取得できるように、マスター サーブレット (他のサーブレットを作成するサーブレット) を実装する必要がありWrapper
ます。クラスファイルをインストールしたら、次の呼び出しを行うことができます。
Context context = (Context) wrapper.getParent();
Wrapper newWrapper = context.createWrapper();
newWrapper.setName(name);
newWrapper.setLoadOnStartup(1);
newWrapper.setServletClass(servletClass);
context.addChild(newWrapper);
context.addServletMapping(pattern, name);
これらの呼び出しは、その場でサーブレットを作成します。この情報を保持する方法を見つける必要があります。これを行うには、web.xml を更新するか、独自のファイルに書き込みます。
実行中のアプリケーションにクラスを追加したり、アプリケーションからクラスを削除したりするのは困難です。商用ソリューションについては、JRebelを参照してください。
ユーザーが会話やセッションを長時間実行していない場合は、Web アプリの再起動がすぐに完了して気付かない可能性があります。これで問題が解決する場合、問題は非常に簡単になります。
Tomcat を実行していると仮定すると、サーバーを構成することができ、ディレクトリreloadable=true
に新しいものをスローするたびにアプリが再起動されます。新しいクラスをディレクトリに追加してから更新できます。これは正常に機能するはずです。それらのクラスが使用されている場合、クラスを削除するのは難しいかもしれません。最初に特定のサーブレット クラスにルーティングされなくなった をデプロイし、クラスのユーザーが離れるのを少し待ってから、クラスを削除して更新された を再度デプロイするという 2 段階のプロセスを実行することをお勧めします。web.xml
webapps
WEB-INF/classes
web.xml
web.xml
web.xml
これを動的に行うことはできないと思いますが、事前に構成されたフィルターを使用して、サーブレットをアクティブまたは非アクティブにしてみてください。データベースまたはファイル システムのいずれかで動的に変更できる値をフィルター チェックし、サーブレットが「オフ」になっている場合に要求を再ルーティングする方法を指定します。
ユーザーになんらかのフィードバックを提供せずにサーブレットをオフにするのは失礼だと思います。