7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-07-17

少し前に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ドキュメントを参照してください。その他のメソッドとして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(オンラインマニュアルのトップ)
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)

以上。

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?