少し前にWebSphere Application Server Liberty(以下、WAS Liberty)環境で、ある制御系機能を開発するためにアクティブ・スレッド数を取得する必要があり、サンプルを作って動作確認したことがありました。久しぶりにサンプル・コードを見たら当時参照した情報源など、いろいろ忘れていたので備忘録としてまとめておきます。
まずは、サンプル・コードです。サーブレットとして実装しました。
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ドキュメントを参照してください。その他のメソッドとしてThreadPoolMXBean#getPoolSize
というメソッドがあるのですが、このメソッドには注意が必要です。このメソッドで取得できるサイズは現時点のスレッド・プール・サイズ(アクティブ・スレッド数と非アクティブスレッド数の合計)であって、スレッド・プール・サイズの上限値ではありません。この値はスレッド要求の状況に応じて変化します。
ThreadPoolMXBeanの取得方法については、上記サンプルのgetThreadPoolMXBeanメソッドを参照してください。
上記サンプルを実行するにはmonitor-1.0
が必要なので、server.xml
の<featureManager>
に<feature>monitor-1.0</feature>
を指定します。
<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(オンラインマニュアルのトップ)
Monitoring the Liberty server runtime environment
Monitoring with monitor-1.0
ThreadPool monitoring
Connecting to Liberty by using JMX
Working with JMX MBeans on Liberty
List of provided MBeans
ThreadPoolMXBeanのAPIドキュメント(Javadoc)
以上。