Java tutorial
/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.s4.core; import java.io.IOException; import java.lang.Thread.UncaughtExceptionHandler; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.s4.core.util.ArchiveFetchException; import org.apache.s4.core.util.ParametersInjectionModule; import org.apache.s4.core.util.ParsingUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.beust.jcommander.JCommander; import com.beust.jcommander.Parameter; import com.beust.jcommander.Parameters; import com.google.common.collect.Maps; import com.google.common.io.Resources; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.util.Modules; /** * Entry point for starting an S4 node. It parses arguments and injects an {@link S4Bootstrap} based on the * {@link BaseModule} minimal configuration. * */ public class S4Node { private static Logger logger = LoggerFactory.getLogger(S4Node.class); public static void main(String[] args) throws InterruptedException, IOException { S4NodeArgs s4Args = new S4NodeArgs(); JCommander jc = new JCommander(s4Args); try { jc.parse(args); } catch (Exception e) { JCommander.getConsole().println("Cannot parse arguments: " + e.getMessage()); jc.usage(); System.exit(1); } startNode(s4Args); } private static void startNode(S4NodeArgs nodeArgs) throws InterruptedException, IOException { Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { logger.error("Uncaught exception in thread {}", t.getName(), e); } }); // inject parameter from the command line, including zk string Map<String, String> inlineParameters = Maps .newHashMap(ParsingUtils.convertListArgsToMap(nodeArgs.extraNamedParameters)); inlineParameters.put("s4.cluster.zk_address", nodeArgs.zkConnectionString); Injector injector = Guice.createInjector( Modules.override(new BaseModule(Resources.getResource("default.s4.base.properties").openStream(), nodeArgs.clusterName)).with(new ParametersInjectionModule(inlineParameters))); S4Bootstrap bootstrap = injector.getInstance(S4Bootstrap.class); try { bootstrap.start(injector); } catch (ArchiveFetchException e1) { logger.error("Cannot fetch module dependencies.", e1); } } /** * Defines command parameters. * */ @Parameters(separators = "=") public static class S4NodeArgs { @Parameter(names = { "-c", "-cluster" }, description = "Cluster name", required = true) String clusterName = null; @Parameter(names = "-baseConfig", description = "S4 base configuration file", required = false) String baseConfigFilePath = null; @Parameter(names = "-zk", description = "Zookeeper connection string", required = false) String zkConnectionString = "localhost:2181"; @Parameter(names = { "-namedStringParameters", "-p" }, description = "Comma-separated list of " + "inline configuration parameters, taking precedence over homonymous configuration parameters from " + "configuration files. Syntax: '-p=name1=value1,name2=value2 '. " + "NOTE: application parameters should be injected in the application configuration/deployment step." + "Only parameters relevant to the node should be injected here, e.g. metrics logging configuration", hidden = false, converter = ParsingUtils.InlineConfigParameterConverter.class) List<String> extraNamedParameters = new ArrayList<String>(); } }