WebSphere Application Server Libertyでアクティブ・スレッド数を取得する

少し前にWebSphere Application Server Liberty(以下、WAS Liberty)環境で、ある制御系機能を開発するためにアクティブ・スレッド数を取得する必要があり、サンプルを作って動作確認したことがありました。久しぶりにサンプル・コードを見たら当時参照した情報源など、いろいろ忘れていたので備忘録としてまとめておきます。

まずは、サンプル・コードです。サーブレットとして実装しました。

```MyMonitorServlet.java
import java.io.IOException;
import java.lang.management.ManagementFactory;

import javax.management.JMX;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.ibm.websphere.monitor.jmx.ThreadPoolMXBean;

@WebServlet("/MyMonitorServlet")
public class MyMonitorServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public MyMonitorServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().append("Threads count : "+getActiveThreadsCount());
	}

	private int getActiveThreadsCount() {
		ThreadPoolMXBean mxbean = getThreadPoolMXBean();
		if (mxbean != null) {
			return mxbean.getActiveThreads();
		}
		throw new RuntimeException("ThreadPoolMXBean not returned.");
	}
	private ThreadPoolMXBean getThreadPoolMXBean() {
		try {
			MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
			ObjectName objName = new ObjectName(
					"WebSphere:type=ThreadPoolStats,name=Default Executor");
			if (mbs.isRegistered(objName)) {
				return JMX.newMBeanProxy(mbs, objName, ThreadPoolMXBean.class);
			}
		} catch (MalformedObjectNameException e) {
				e.printStackTrace();
		}
		return null;
	}
}
```

スレッド・プールの情報は、`com.ibm.websphere.monitor.jmx.ThreadPoolMXBean`から取得できます。上記サンプル（getActiveThreadsCountメソッド）では、`ThreadPoolMXBean#getActiveThreads`メソッドを使ってアクティブ・スレッド数を取得しています。メソッドの詳細については、[ThreadPoolMXBeanのAPIドキュメント](https://www.ibm.com/support/knowledgecenter/SSD28V_liberty/com.ibm.websphere.javadoc.liberty.doc/com.ibm.websphere.appserver.api.monitor_1.1-javadoc/com/ibm/websphere/monitor/jmx/ThreadPoolMXBean.html)を参照してください。その他のメソッドとして`ThreadPoolMXBean#getPoolSize`というメソッドがあるのですが、このメソッドには注意が必要です。このメソッドで取得できるサイズは現時点のスレッド・プール・サイズ（アクティブ・スレッド数と非アクティブスレッド数の合計）であって、スレッド・プール・サイズの上限値ではありません。この値はスレッド要求の状況に応じて変化します。
ThreadPoolMXBeanの取得方法については、上記サンプルのgetThreadPoolMXBeanメソッドを参照してください。

上記サンプルを実行するには`monitor-1.0`が必要なので、`server.xml`の`<featureManager>`に`<feature>monitor-1.0</feature>`を指定します。

```server.xml
    <featureManager>
        （途中省略）
        <feature>monitor-1.0</feature>
    </featureManager>
```
ブラウザーから上記サンプル・コードのサーブレットを実行すると、スレッド数が表示されます（自分以外だれも使っていない環境ではたぶん"Threads count : 1"と表示されると思います）。

サンプル・コードの稼働確認に使ったWAS Libertyのバージョンは以下のとおり。OSはWindows 10です。
**IBM WebSphere Application Server V8.5.5 Liberty Core**
**Version18.0.0.3 (8.5.18003.20180905_2337)** 

サンプル・コードを作成する際に参照したWAS Libertyのオンライン・マニュアルは以下のとおりです。

**WAS Libertyオンラインマニュアル参照ページ**
[WebSphere Application Server Liberty Core（オンラインマニュアルのトップ）](https://www.ibm.com/support/knowledgecenter/SSD28V_liberty/as_ditamaps/welcome_liberty_core.html)
[Monitoring the Liberty server runtime environment](https://www.ibm.com/support/knowledgecenter/SSD28V_liberty/com.ibm.websphere.wlp.core.doc/ae/twlp_mon.html)
[Monitoring with monitor-1.0](https://www.ibm.com/support/knowledgecenter/SSD28V_liberty/com.ibm.websphere.wlp.core.doc/ae/twlp_monitor10.html)
[ThreadPool monitoring](https://www.ibm.com/support/knowledgecenter/SSD28V_liberty/com.ibm.websphere.wlp.core.doc/ae/rwlp_mon_threadpool.html)
[Connecting to Liberty by using JMX](https://www.ibm.com/support/knowledgecenter/SSD28V_liberty/com.ibm.websphere.wlp.core.doc/ae/twlp_admin_jmx.html)
[Working with JMX MBeans on Liberty](https://www.ibm.com/support/knowledgecenter/SSD28V_liberty/com.ibm.websphere.wlp.core.doc/ae/twlp_admin_mbeans.html)
[List of provided MBeans](https://www.ibm.com/support/knowledgecenter/SSD28V_liberty/com.ibm.websphere.wlp.core.doc/ae/rwlp_mbeans_list.html)
[ThreadPoolMXBeanのAPIドキュメント(Javadoc)](https://www.ibm.com/support/knowledgecenter/SSD28V_liberty/com.ibm.websphere.javadoc.liberty.doc/com.ibm.websphere.appserver.api.monitor_1.1-javadoc/com/ibm/websphere/monitor/jmx/ThreadPoolMXBean.html)


以上。