MBeanServerを使用してorg.apache.catalina.server.StandardServer
を回復する必要があります。これは、すべてのTomcatのシステム要素のルートエントリです:
import java.lang.management.ManagementFactory;
import java.util.Collection;
import java.util.HashSet;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import org.apache.catalina.Service;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.core.StandardServer;
import org.apache.log4j.Logger;
public class TomcatConnectors {
public static final String CATALINA_SERVICE_NAME = "Catalina";
public static final String CONNECTOR_HTTP_PROTOCOL_NAME = "HTTP/1.1";
private Logger logger = Logger.getLogger(this.getClass());
private Collection<Connector> connectors;
/**
*
*/
public TomcatConnectors() {
super();
this.connectors = new HashSet<Connector>();
this.loadConnectors();
}
/**
*
* @return
*/
protected StandardServer getServerInstance(){
org.apache.catalina.core.StandardServer server = null;
try{
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
server = (StandardServer)mbeanServer.getAttribute(
new ObjectName("Catalina:type=Server"),
"managedResource"
);
if(logger.isDebugEnabled()){
logger.debug("Server found. Info: ");
logger.debug(" - address : " + server.getAddress());
logger.debug(" - domain : " + server.getDomain());
logger.debug(" - info : " + server.getInfo());
logger.debug(" - shutdown port : " + server.getPort());
logger.debug(" - shutdown command : " + server.getShutdown());
logger.debug(" - serverInfo : " + server.getServerInfo());
logger.debug(" - status : " + server.getStateName());
}
}catch(Throwable t){
logger.fatal("Fatal Error Recovering StandardServer from MBeanServer : " + t.getClass().getName() + ": " + t.getMessage(), t);
}
return server;
}
/*
*
*/
protected Service getCatalinaService(){
org.apache.catalina.core.StandardServer server = this.getServerInstance();
Service[] services = server.findServices();
for(Service aService : services){
if(logger.isDebugEnabled()){
logger.debug("Service: " + aService.getName() +
", info: " + aService.getInfo() +
", state: " + aService.getStateName());
}
if(aService.getName().equalsIgnoreCase(CATALINA_SERVICE_NAME)){
return aService;
}
}
return null;
}
protected void loadConnectors() {
Service catalinaService = this.getCatalinaService();
if(catalinaService == null){
throw new IllegalStateException("Service Catalina cannot be null");
}
if(catalinaService.findConnectors() != null && catalinaService.findConnectors().length > 0){
logger.debug("List of connectors: ");
for(Connector aConnector : catalinaService.findConnectors()){
if(logger.isDebugEnabled()){
logger.debug("Connector.getProtocol: " + aConnector.getProtocol());
logger.debug("Connector.getPort: " + aConnector.getPort());
logger.debug("Connector.getInfo: " + aConnector.getInfo());
logger.debug("Connector.getStateName: " + aConnector.getStateName());
logger.debug("Connector.property.bindOnInit: " + aConnector.getProperty("bindOnInit"));
logger.debug("Connector.attribute.bindOnInit: " + aConnector.getAttribute("bindOnInit"));
logger.debug("Connector.getState: " + aConnector.getState());
}
this.connectors.add(aConnector);
}
}
}
/**
* @return the connectors
*/
public Collection<Connector> getConnectors() {
if(this.connectors.isEmpty()){
this.loadConnectors();
}
return connectors;
}
}
私はこのコネクタの構成でテストしてみた:
<Service name="Catalina">
<Connector connectionTimeout="20000" port="8787" protocol="HTTP/1.1" redirectPort="8443"/>
<Connector bindOnInit="false" port="8009" protocol="AJP/1.3" redirectPort="8443"/>
...
そして、これがログ出力されます:
HH:mm:ss,046 DEBUG TomcatConnectors:46 - Server found. Info:
HH:mm:ss,046 DEBUG TomcatConnectors:47 - - address : localhost
HH:mm:ss,046 DEBUG TomcatConnectors:48 - - domain : Catalina
HH:mm:ss,046 DEBUG TomcatConnectors:49 - - info : org.apache.catalina.core.StandardServer/1.0
HH:mm:ss,046 DEBUG TomcatConnectors:50 - - shutdown port : 8005
HH:mm:ss,046 DEBUG TomcatConnectors:51 - - shutdown command : SHUTDOWN
HH:mm:ss,046 DEBUG TomcatConnectors:52 - - serverInfo : Apache Tomcat/7.0.29
HH:mm:ss,046 DEBUG TomcatConnectors:53 - - status : STARTING
HH:mm:ss,047 DEBUG TomcatConnectors:71 - Service: Catalina, info: org.apache.catalina.core.StandardService/1.0, state: STARTING
HH:mm:ss,047 DEBUG TomcatConnectors:89 - List of connectors:
HH:mm:ss,047 DEBUG TomcatConnectors:92 - Connector.getProtocol: HTTP/1.1
HH:mm:ss,047 DEBUG TomcatConnectors:93 - Connector.getPort: 8787
HH:mm:ss,047 DEBUG TomcatConnectors:94 - Connector.getInfo: org.apache.catalina.connector.Connector/2.1
HH:mm:ss,047 DEBUG TomcatConnectors:95 - Connector.getStateName: INITIALIZED
HH:mm:ss,047 DEBUG TomcatConnectors:96 - Connector.property.bindOnInit: null
HH:mm:ss,047 DEBUG TomcatConnectors:97 - Connector.attribute.bindOnInit: null
HH:mm:ss,047 DEBUG TomcatConnectors:98 - Connector.getState: INITIALIZED
HH:mm:ss,048 DEBUG TomcatConnectors:92 - Connector.getProtocol: AJP/1.3
HH:mm:ss,048 DEBUG TomcatConnectors:93 - Connector.getPort: 8009
HH:mm:ss,048 DEBUG TomcatConnectors:94 - Connector.getInfo: org.apache.catalina.connector.Connector/2.1
HH:mm:ss,048 DEBUG TomcatConnectors:95 - Connector.getStateName: INITIALIZED
HH:mm:ss,048 DEBUG TomcatConnectors:96 - Connector.property.bindOnInit: false
HH:mm:ss,048 DEBUG TomcatConnectors:97 - Connector.attribute.bindOnInit: false
HH:mm:ss,048 DEBUG TomcatConnectors:98 - Connector.getState: INITIALIZED
することができますbinOnInit
プロパティには、コネクタのgetProperty()
またはgetAttribute()
メソッドを通じてアクセスでき、実際にはが返されることを確認してくださいAJPコネクタの値:
HH:mm:ss,048 DEBUG TomcatConnectors:92 - Connector.getProtocol: AJP/1.3
HH:mm:ss,048 DEBUG TomcatConnectors:96 - Connector.property.bindOnInit: false
HH:mm:ss,048 DEBUG TomcatConnectors:97 - Connector.attribute.bindOnInit: false
この値はどうしますか? –
私はこれらの値を読む方法を知りたいです。 –
bindOnInit = "false"のときにConnectorがどのように動作するかを知っていれば私に説明できます。 –