in zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java [158:313]
public void startZeppelin() {
initMetrics();
TimedHandler timedHandler = new TimedHandler(Metrics.globalRegistry, Tags.empty());
jettyWebServer.setHandler(timedHandler);
ContextHandlerCollection contexts = new ContextHandlerCollection();
timedHandler.setHandler(contexts);
ServiceLocatorUtilities.enableImmediateScope(sharedServiceLocator);
ServiceLocatorUtilities.addClasses(sharedServiceLocator,
ImmediateErrorHandlerImpl.class);
ImmediateErrorHandlerImpl handler = sharedServiceLocator.getService(ImmediateErrorHandlerImpl.class);
ServiceLocatorUtilities.bind(
sharedServiceLocator,
new AbstractBinder() {
@Override
protected void configure() {
bind(storage).to(ConfigStorage.class);
bindAsContract(PluginManager.class).in(Singleton.class);
bind(GsonNoteParser.class).to(NoteParser.class).in(Singleton.class);
bindAsContract(InterpreterFactory.class).in(Singleton.class);
bindAsContract(NotebookRepoSync.class).to(NotebookRepo.class).in(Singleton.class);
bindAsContract(Helium.class).in(Singleton.class);
bind(zConf).to(ZeppelinConfiguration.class);
bindAsContract(InterpreterSettingManager.class).in(Singleton.class);
bindAsContract(InterpreterService.class).in(Singleton.class);
bindAsContract(Credentials.class).in(Singleton.class);
bindAsContract(AdminService.class).in(Singleton.class);
bindAsContract(AuthorizationService.class).in(Singleton.class);
bindAsContract(ConnectionManager.class).in(Singleton.class);
bindAsContract(NoteManager.class).in(Singleton.class);
// TODO(jl): Will make it more beautiful
if (!StringUtils.isBlank(zConf.getShiroPath())) {
bind(ShiroAuthenticationService.class).to(AuthenticationService.class).in(Singleton.class);
} else {
// TODO(jl): Will be added more type
bind(NoAuthenticationService.class).to(AuthenticationService.class).in(Singleton.class);
}
bindAsContract(HeliumBundleFactory.class).in(Singleton.class);
bindAsContract(HeliumApplicationFactory.class).in(Singleton.class);
bindAsContract(ConfigurationService.class).in(Singleton.class);
bindAsContract(NotebookService.class).in(Singleton.class);
bindAsContract(JobManagerService.class).in(Singleton.class);
bindAsContract(Notebook.class).in(Singleton.class);
bindAsContract(NotebookServer.class)
.to(AngularObjectRegistryListener.class)
.to(RemoteInterpreterProcessListener.class)
.to(ApplicationEventListener.class)
.to(NoteEventListener.class)
.in(Singleton.class);
if (zConf.isZeppelinNotebookCronEnable()) {
bind(QuartzSchedulerService.class).to(SchedulerService.class).in(Singleton.class);
} else {
bind(NoSchedulerService.class).to(SchedulerService.class).in(Singleton.class);
}
if (zConf.getBoolean(ConfVars.ZEPPELIN_SEARCH_ENABLE)) {
bind(LuceneSearch.class).to(SearchService.class).in(Singleton.class);
} else {
bind(NoSearchService.class).to(SearchService.class).in(Singleton.class);
}
}
});
// Multiple Web UI
String classicUiWebAppContextPath;
String newUiWebAppContextPath;
if (isNewUiDefault(zConf)) {
classicUiWebAppContextPath = NON_DEFAULT_CLASSIC_UI_WEB_APP_CONTEXT_PATH;
newUiWebAppContextPath = zConf.getServerContextPath();
} else {
classicUiWebAppContextPath = zConf.getServerContextPath();
newUiWebAppContextPath = NON_DEFAULT_NEW_UI_WEB_APP_CONTEXT_PATH;
}
final WebAppContext newUiWebApp = setupWebAppContext(contexts, zConf, zConf.getString(ConfVars.ZEPPELIN_ANGULAR_WAR),
newUiWebAppContextPath);
final WebAppContext classicUiWebApp = setupWebAppContext(contexts, zConf, zConf.getString(ConfVars.ZEPPELIN_WAR),
classicUiWebAppContextPath);
initWebApp(newUiWebApp);
initWebApp(classicUiWebApp);
NotebookRepo repo =
ServiceLocatorUtilities.getService(sharedServiceLocator, NotebookRepo.class.getName());
NoteParser noteParser =
ServiceLocatorUtilities.getService(sharedServiceLocator, NoteParser.class.getName());
try {
repo.init(zConf, noteParser);
} catch (IOException e) {
LOGGER.error("Failed to init NotebookRepo", e);
}
initJMX();
runNoteOnStart(sharedServiceLocator);
Runtime.getRuntime().addShutdownHook(new Thread(this::shutdown));
// Try to get Notebook from ServiceLocator, because Notebook instantiation is lazy, it is
// created when user open zeppelin in browser if we don't get it explicitly here.
// Lazy loading will cause paragraph recovery and cron job initialization is delayed.
Notebook notebook = ServiceLocatorUtilities.getService(
sharedServiceLocator, Notebook.class.getName());
ServiceLocatorUtilities.getService(
sharedServiceLocator, SearchService.class.getName());
ServiceLocatorUtilities.getService(
sharedServiceLocator, SchedulerService.class.getName());
// Initialization of the Notes in the notebook asynchronously
notebook.initNotebook();
// Try to recover here, don't do it in constructor of Notebook, because it would cause deadlock.
notebook.recoveryIfNecessary();
LOGGER.info("Starting zeppelin server");
/*
* Get a nice Dump after jetty start, quite helpful for debugging
* jettyWebServer.setDumpAfterStart(true);
*/
try {
jettyWebServer.start(); // Instantiates ZeppelinServer
if (zConf.getJettyName() != null) {
org.eclipse.jetty.http.HttpGenerator.setJettyVersion(zConf.getJettyName());
}
} catch (Exception e) {
LOGGER.error("Error while running jettyServer", e);
System.exit(-1);
}
LOGGER.info("Done, zeppelin server started");
try {
List<ErrorData> errorDatas = handler.waitForAtLeastOneConstructionError(5000);
for (ErrorData errorData : errorDatas) {
LOGGER.error("Error in Construction", errorData.getThrowable());
}
if (!errorDatas.isEmpty()) {
LOGGER.error("{} error(s) while starting - Termination", errorDatas.size());
System.exit(-1);
}
} catch (InterruptedException e) {
// Many fast unit tests interrupt the Zeppelin server at this point
LOGGER.error("Interrupt while waiting for construction errors - init shutdown", e);
shutdown();
Thread.currentThread().interrupt();
}
if (jettyWebServer.isStopped() || jettyWebServer.isStopping()) {
LOGGER.debug("jetty server is stopped {} - is stopping {}", jettyWebServer.isStopped(), jettyWebServer.isStopping());
} else {
try {
jettyWebServer.join();
} catch (InterruptedException e) {
LOGGER.error("Interrupt while waiting for jetty threads - init shutdown", e);
shutdown();
Thread.currentThread().interrupt();
}
}
}