Reputation: 1
I have connector tag configured in server.xml as below.
<Connector port="8080" bindOnInit="false" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
I want to read value of bindOnInit parameter at runtime using java code. I do not want to parse the xml. As i searched i found that i can get data from Tomcat tomcat = new Tomcat(); tomcat object. How can i get existing tomcat object instead of creating new one because creating new tomcat object will not give me configured value.
Please help in reading bindOnInit parameter at Runtime using java code.
Thank you in advance.
Upvotes: 0
Views: 2038
Reputation: 6444
You must recover the org.apache.catalina.server.StandardServer
using MBeanServer. This is the root entry for all Tomcat system elements:
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;
}
}
I've tested with this connector configuration:
<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"/>
...
And this is the log output:
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
You can see that the binOnInit
property can be accessed through the getProperty()
or getAttribute()
methods of the Connector, and that it actually returns the false
value for AJP connector:
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
Upvotes: 1