in gateway-server/src/main/java/org/apache/knox/gateway/GatewayServer.java [615:724]
private synchronized void start() throws Exception {
// Create the global context handler.
contexts = new ContextHandlerCollection();
// A map to keep track of current deployments by cluster name.
deployments = new ConcurrentHashMap<>();
// Create Jetty.
createJetty();
// Add Annotations processing into the Jetty server to support JSPs
Configuration.ClassList classlist = Configuration.ClassList.setServerDefault( jetty );
classlist.addBefore(
"org.eclipse.jetty.webapp.JettyWebXmlConfiguration",
"org.eclipse.jetty.annotations.AnnotationConfiguration" );
// Load the current topologies.
// Redeploy autodeploy topologies.
File topologiesDir = calculateAbsoluteTopologiesDir();
monitor = services.getService(ServiceType.TOPOLOGY_SERVICE);
// Shared providers and descriptors should be reloaded before topology reloading at startup, so that any changes to descriptors
// will be realized before Knox deploys "old" topologies that would have re-deployed anyway in a matter of seconds
// by the descriptor monitor
handleHadoopXmlResources();
// at this point descriptors are supposed to be generated from hxr
gatewayStatusService = services.getService(ServiceType.GATEWAY_STATUS_SERVICE);
gatewayStatusService.initTopologiesToCheck();
monitor.addTopologyChangeListener(listener);
log.loadingTopologiesFromDirectory(topologiesDir.getAbsolutePath());
monitor.reloadTopologies();
List<String> autoDeploys = config.getAutoDeployTopologyNames();
if (autoDeploys != null) {
for (String topologyName : autoDeploys) {
monitor.redeployTopology(topologyName);
}
}
final ServiceDefinitionRegistry serviceDefinitionRegistry = services.getService(ServiceType.SERVICE_DEFINITION_REGISTRY);
serviceDefinitionRegistry.addServiceDefinitionChangeListener(monitor);
final Map<String, Integer> topologyPortMap = config.getGatewayPortMappings();
// List of all the topology that are deployed (or will be deployed soon)
final Set<String> deployedTopologyList = gatewayStatusService.collectTopologies(config);
// Check whether the configured topologies for port mapping exist, if not
// log WARN message and continue
checkMappedTopologiesExist(topologyPortMap, deployedTopologyList);
final HandlerCollection handlers = createHandlers( config, services, contexts, topologyPortMap);
// Check whether a topology wants dedicated port,
// if yes then we create a connector that listens on the provided port.
log.gatewayTopologyPortMappingEnabled(config.isGatewayPortMappingEnabled());
if (config.isGatewayPortMappingEnabled()) {
for (Map.Entry<String, Integer> entry : topologyPortMap.entrySet()) {
// Add connector for only valid topologies, i.e. deployed topologies.
// and NOT for Default Topology listening on standard gateway port.
if(deployedTopologyList.contains(entry.getKey()) && (entry.getValue() != config.getGatewayPort()) ) {
log.createJettyConnector(entry.getKey().toLowerCase(Locale.ROOT), convertPortToString(entry.getValue()));
try {
List<Connector> connectors = createConnector(jetty, config, entry.getValue(), entry.getKey().toLowerCase(Locale.ROOT));
for (Connector connector : connectors) {
jetty.addConnector(connector);
}
} catch(final IOException e) {
/* in case of port conflict we log error and move on */
if( e.toString().contains("ports for topologies (if defined) have to be unique.") ) {
log.startedGatewayPortConflict(entry.getKey().toLowerCase(Locale.ROOT), convertPortToString(entry.getValue()));
} else {
throw e;
}
}
}
}
}
jetty.setHandler(handlers);
jetty.addLifeCycleListener(new GatewayServerLifecycleListener(config));
// Start Jetty.
try {
jetty.start();
}
catch (IOException e) {
log.failedToStartGateway( e );
throw e;
}
cleanupTopologyDeployments();
// Start the topology monitor.
monitor.startMonitor();
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
try {
server.stop();
} catch (Exception e) {
//NOP: error is already logged in the stop() method
}
}
});
}