読者です 読者をやめる 読者になる 読者になる

稼働中のサーブレットインスタンスを取得する。

あまりないと思いますが、
Tomcatでアプリケーション稼働中、あるサーブレットインスタンスが持つ情報を見たり修正したい時があるとします。
それができる画面や仕組みがアプリケーションにあればいいですが、ない時は困りますね。
以下の方法を使えば、稼働中のサーブレットインスタンスを取得し、何らかの操作が可能です。
あくまで裏技ですし、場合によっては事故になるかも知れませんので、自己責任でお願いします。

まず、取得したいサーブレットの名前が以下のweb.xmlの通り、HogeServletとします。

...
<servlet>
      <servlet-name>HogeServlet</servlet-name>
      <servlet-class>xyz.dukelab.HogeServlet</servlet-class>
</servlet>
...

以下のようなJSPを作成し、サーバにアップロードし、ブラウザやcurlなどでJSPにアクセスすればいいです。

<%@ page import="javax.management.*"%>
<%@ page import="org.apache.catalina.core.*" %>
<%@ page import="org.apache.catalina.Server"%>
<%@ page import="xyz.dukelab.HogeServlet" %>
<%
    MBeanServer mBeanServer = MBeanServerFactory.findMBeanServer(null).get(0);
    ObjectName name = new ObjectName("Catalina", "type", "Server");
    
    // Tomcat関連インスタンス取得
    Server server = (Server) mBeanServer.getAttribute(name, "managedResource");    
    StandardEngine engine = (StandardEngine) server.findService("Catalina").getContainer();
    StandardContext context = (StandardContext) engine.findChild(engine.getDefaultHost()).findChild(getServletContext().getContextPath());
    
    // HogeServletのインスタンスのラッパーインスタンスを取得。
    StandardWrapper sw = (StandardWrapper) context.findChild("HogeServlet");
    
    // HogeServletを取得。
    HogeServlet hs = (HogeServlet) sw.getServlet();
    
    // HogeServletのメソッドを呼び出したり、リフレクションを使ってフィールドやメソッドにアクセスする。
    ...
%>