/*
* Copyright 2012 the original author or authors.
*
* Licensed 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 com.nokia.dempsy.spring;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MarkerFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.nokia.dempsy.Dempsy;
import com.nokia.dempsy.DempsyException;
public class RunNode
{
protected static Logger logger = LoggerFactory.getLogger(RunNode.class);
protected static final String appdefParam = "appdef";
protected static final String applicationParam = "application";
protected static final String zk_connectParam = "zk_connect";
protected static final String zk_timeoutParam = "zk_session_timeout";
protected static final String zk_timeoutDefault = "5000";
protected static final String total_slots_per_clusterParam = "total_slots_for_cluster";
protected static final String total_slots_per_clusterDefault = "100";
protected static final String min_num_nodes_per_clusterParam = "min_nodes_for_cluster";
protected static final String min_num_nodes_per_clusterDefault = "3";
public static void main(String[] args)
{
try
{
run(args);
}
catch(Throwable e)
{
e.printStackTrace(System.err);
System.err.flush();
System.exit(1);
}
System.exit(0);
}
public static void run(String[] args) throws Throwable
{
//======================================================
// Handle all of the options.
String application = System.getProperty(applicationParam);
if (application == null || application.length() == 0)
usage("the java vm option \"-D" + applicationParam + "\" wasn't specified.");
String[] clusterIdParts = application.split(":");
if (clusterIdParts.length != 2)
usage("invalid format for the -Dcluster option. It should be a clusterid of the form \"applicationName:clusterName.\"");
System.setProperty("application", clusterIdParts[0]);
System.setProperty("cluster", clusterIdParts[1]);
String appCtxFilename = System.getProperty(appdefParam);
if (appCtxFilename == null || appCtxFilename.length() == 0)
{
// usage("the java vm option \"-D" + appdefParam + "\" wasn't specified.");
appCtxFilename = "DempsyApplicationContext-"+clusterIdParts[0]+".xml";
}
String zkConnect = System.getProperty(zk_connectParam);
if (zkConnect == null || zkConnect.length() == 0)
usage("the java vm option \"-D" + zk_connectParam + "\" wasn't specified.");
String zkTimeout = System.getProperty(zk_timeoutParam);
if (zkTimeout == null || zkTimeout.length() == 0)
System.setProperty(zk_timeoutParam, zk_timeoutDefault);
String totalSlots = System.getProperty(total_slots_per_clusterParam);
if (totalSlots == null || totalSlots.length() == 0)
System.setProperty(total_slots_per_clusterParam, total_slots_per_clusterDefault);
String minNodes = System.getProperty(min_num_nodes_per_clusterParam);
if (minNodes == null || minNodes.length() == 0)
System.setProperty(min_num_nodes_per_clusterParam, min_num_nodes_per_clusterDefault);
//======================================================
String contextFile = "classpath:Dempsy-distributed.xml";
ClassPathXmlApplicationContext context = null;
try
{
// Initialize Spring
context = new ClassPathXmlApplicationContext(new String[] {appCtxFilename, contextFile});
context.registerShutdownHook();
}
catch(Throwable e)
{
logger.error(MarkerFactory.getMarker("FATAL"), "Failed to start the application ", e);
throw e;
}
if(context != null)
{
try
{
context.getBean(Dempsy.class).waitToBeStopped();
}
catch(InterruptedException e)
{
logger.error("Interrupted . . . ", e);
}
finally
{
context.stop();
}
logger.info("Shut down dempsy appliction "+appCtxFilename+"-"+application + ", bye!");
}
}
public static void usage(String errorMessage) throws DempsyException
{
StringBuilder sb = new StringBuilder();
if (errorMessage != null)
sb.append("ERROR:" + errorMessage + "\n");
sb.append("usage example: java -D"+ appdefParam + "=MyAppDefinition.xml -D"+ applicationParam +
"=ClusterToStart -D" + zk_connectParam + "=ZookeeperConnectUrlString [-D"+ zk_timeoutParam +
"=" + zk_timeoutDefault + "] [-D" + total_slots_per_clusterParam + "=" + total_slots_per_clusterDefault +
"] [-D" + min_num_nodes_per_clusterParam + "=" + min_num_nodes_per_clusterDefault +
"] -cp (classpath) " + RunNode.class.getName() + "\n");
sb.append(" -D" + appdefParam + " must be supplied to indicate the Dempsy application definition's spring application context xml file.\n");
sb.append(" A file with the name given that contains a spring application context xml must be on the classpath.\n");
sb.append(" -D" + applicationParam + " should fully specify which cluster we are starting using the clusterid format \"appname:clustername\"\n");
sb.append(" -D" + zk_connectParam + " should specify the connect string for zookeeper.\n");
sb.append(" see: http://zookeeper.apache.org/doc/r3.2.2/api/org/apache/zookeeper/ZooKeeper.html#ZooKeeper%28java.lang.String,%20int,%20org.apache.zookeeper.Watcher%29\n");
sb.append(" -D" + zk_timeoutParam + " is optional. It should specify the session timeout for zookeeper. The default is " + zk_timeoutDefault + "\n");
sb.append(" see: http://zookeeper.apache.org/doc/r3.2.2/api/org/apache/zookeeper/ZooKeeper.html#ZooKeeper%28java.lang.String,%20int,%20org.apache.zookeeper.Watcher%29\n");
sb.append(" -D" + total_slots_per_clusterParam + " Should specify the total number of address bins for hashing the messages. Please read the Dempsy Users Guide for details. If not specified the default is " + total_slots_per_clusterDefault + "\n");
sb.append(" -D" + min_num_nodes_per_clusterParam + " Should specify the minumum number of nodes required for this cluster. Please read the Dempsy Users Guide for details. If not specified the default is " + min_num_nodes_per_clusterDefault + "\n");
logger.error(MarkerFactory.getMarker("FATAL"), sb.toString());
throw new DempsyException(sb.toString());
}
}