blob: fb8f6e476cc3fe8b096ef8dc4a2ae6f1e9927a1e [file] [log] [blame]
/**
* 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>();
}
}