返回> 网站首页
Tomcat多项目启停控制 - JMX的使用
yoours2025-01-24 19:24:08
简介一边听听音乐,一边写写文章。
一、Tomcat多项目配置
conf目录下,修改server.xml文件
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="soskp.com" appBase="" unpackWARs="false" autoDeploy="false">
<Alias>www.soskp.com</Alias>
<Context path="" reloadable="true" docBase="C:/webapps/soskp" name="soskp" sessionCookieName="soskp" />
</Host>
<Host name="0.soskp.com" appBase="" unpackWARs="false" autoDeploy="false">
<Alias>images.yoours.com</Alias>
<Context path="" docBase="C:/webapps/images" name="images" reloadable="false" />
</Host>
<Host name="1.soskp.com" appBase="" unpackWARs="false" autoDeploy="false">
<Alias>manage.yoours.com</Alias>
<Context path="" docBase="C:/webapps/manage" name="manage" reloadable="true" sessionCookieName="manage_soskp" />
</Host>
<Host name="2.soskp.com" appBase="" unpackWARs="false" autoDeploy="false">
<Alias>k.yoours.com</Alias>
<Context path="" docBase="C:/webapps/k" name="k" reloadable="true" sessionCookieName="k_soskp" privileged="true" />
</Host>
</Engine>
二、JMX配置
bin目录下创建setenv.bat文件,内容:
set CATALINA_OPTS=%CATALINA_OPTS% -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
三、java代码示例
try {
final String JMX_URL = "service:jmx:rmi:///jndi/rmi://localhost:9010/jmxrmi";
// 连接到Tomcat的JMX服务
JMXServiceURL url = new JMXServiceURL(JMX_URL);
JMXConnector jmxConnector = JMXConnectorFactory.connect(url);
MBeanServerConnection mbsc = jmxConnector.getMBeanServerConnection();
ObjectName query = new ObjectName("Catalina:type=Host,*");
Set<ObjectName> contexts = mbsc.queryNames(query, null);
// 枚举项目
for (ObjectName context : contexts) {
String hostName = context.getKeyProperty("host");
System.out.println("Host Name: " + hostName);
if(hostName.compareTo("1.soskp.com")!=0)
continue;
// 获取项目运行状态
String stateName = (String) mbsc.getAttribute(context, "stateName");
System.out.println(" State Name: " + stateName);
String name = (String) mbsc.getAttribute(context, "name");
System.out.println(" name: " + name);
// 操作 Host
if (stateName.equals("STOPPED")) {
// 启动 Host
mbsc.invoke(context, "start", null, null);
System.out.println(" Started Host: " + hostName);
} else if (stateName.equals("STARTED")) {
// 停止 Host
mbsc.invoke(context, "stop", null, null);
System.out.println(" Stopped Host: " + hostName);
}
// 添加别名
String alias = "alias." + hostName;
mbsc.invoke(context, "addAlias", new Object[]{alias}, new String[]{"java.lang.String"});
System.out.println(" Added Alias: " + alias + " to Host: " + hostName);
break;
}
// 关闭JMX连接
jmxConnector.close();
} catch (Exception e) {
e.printStackTrace();
}
四、MBean
在 Tomcat 中,JMX(Java Management Extensions)用于监控和管理各种组件。每个组件在 JMX 中都有一个唯一的标识符,称为 ObjectName。ObjectName 的格式通常是 domain:key=value,key=value,...,其中 domain 是命名空间,key=value 对是属性键值对。
Catalina:type=Server 的来源
Domain (Catalina): 这是 Tomcat 的默认 JMX 域名。Tomcat 使用 Catalina 作为其 JMX 域名来区分其他应用程序或服务的 MBeans。
Type (Server): 这是 MBean 的类型。Server 类型代表 Tomcat 的顶层服务器组件,即 StandardServer 类。
常见的 Tomcat JMX MBeans
Tomcat 的 JMX MBeans 通常包括以下几种类型,每种类型都有其特定的 ObjectName:
Server:
ObjectName: Catalina:type=Server
描述: 代表整个 Tomcat 服务器实例。
Service:
ObjectName: Catalina:type=Service,name=Catalina
描述: 代表 Tomcat 的服务组件,通常只有一个服务。
Connector:
ObjectName: Catalina:type=Connector,port=8080,protocol="HTTP/1.1"
描述: 代表 Tomcat 的连接器组件,用于处理 HTTP/HTTPS 请求。
Engine:
ObjectName: Catalina:type=Engine,name=Catalina
描述: 代表 Tomcat 的引擎组件,负责处理请求的路由和分发。
Host:
ObjectName: Catalina:type=Host,host=localhost,service=Catalina
描述: 代表 Tomcat 的虚拟主机组件,每个虚拟主机可以托管多个 Web 应用程序。
Context:
ObjectName: Catalina:type=Context,path=/myapp,host=localhost,service=Catalina
描述: 代表 Tomcat 中部署的 Web 应用程序上下文。
示例 ObjectName 解释
Catalina:type=Server:
Domain: Catalina
Type: Server
描述: 这个 ObjectName 代表整个 Tomcat 服务器实例,可以通过它获取服务器级别的信息。
Catalina:type=Connector,port=8080,protocol="HTTP/1.1":
Domain: Catalina
Type: Connector
Port: 8080
Protocol: HTTP/1.1
描述: 这个 ObjectName 代表监听 8080 端口的 HTTP 连接器。
如何查找 MBeans
你可以使用 JConsole 或 VisualVM 等工具连接到 Tomcat 的 JMX 服务,浏览和查找所有可用的 MBeans 及其 ObjectName。这些工具提供了图形界面,方便你查看和操作 MBeans。
五、JConsole
查找 MBeans,启动 jconsole:
连接到 Tomcat 的 JMX 服务:
输入 JMX URL: service:jmx:rmi:///jndi/rmi://localhost:12345/jmxrmi
连接后,你可以在 MBeans 树中查看所有可用的 MBeans 及其 ObjectName。
如图: