/** * Copyright 2012 Comcast Corporation * * 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.comcast.cns.tools; import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.util.EnumSet; import java.util.concurrent.atomic.AtomicLong; import javax.management.MBeanServer; import javax.management.ObjectName; import org.apache.log4j.Logger; import com.comcast.cmb.common.controller.CMBControllerServlet; import com.comcast.cmb.common.persistence.AbstractDurablePersistence; import com.comcast.cmb.common.persistence.DurablePersistenceFactory; import com.comcast.cmb.common.util.CMBProperties; import com.comcast.cmb.common.util.PersistenceException; import com.comcast.cmb.common.util.Util; /** * The main class for the tool that sends out notifications or creates endpointPublich jobs * * @author aseem, ppang, bwolf */ public class CNSPublisher { private static Logger logger = Logger.getLogger(CNSPublisher.class); public enum Mode { Producer, Consumer } static volatile EnumSet<Mode> modes; static volatile CNSPublisherJobThread[] jobProducers = null; static volatile CNSPublisherJobThread[] consumers = null; // used for ping public static volatile AtomicLong lastProducerMinute = new AtomicLong(0); public static volatile AtomicLong lastConsumerMinute = new AtomicLong(0); public static volatile AbstractDurablePersistence cassandraHandler = DurablePersistenceFactory.getInstance(); private static void printUsage() { System.out.println("java <opts> com.comcast.cns.tools.CNSPublisher -role=<comma separated list of roles>"); System.out.println("where possible roles are {Producer, Consumer}"); } private static EnumSet<Mode> parseMode(String param) { String[] roles; if (param.contains("=")) { String []arr = param.split("="); if (arr.length != 2) { throw new IllegalArgumentException("Bad format for parameter. Expected:-role=<comma seperated list of roles> got:" + param); } roles = arr[1].split(","); } else { roles = param.split(","); } if (roles.length == 0) { throw new IllegalArgumentException("Expected a comma separated list of roles. Got:" + param); } EnumSet<Mode> ms = EnumSet.of(Mode.valueOf(roles[0])); for (int i = 1; i < roles.length; i++) { ms.add(Mode.valueOf(roles[i])); } return ms; } public static String getModeString() { if (modes.contains(Mode.Producer) && modes.contains(Mode.Consumer)) { return "Producer,Consumer"; } else if (modes.contains(Mode.Producer)) { return "Producer"; } else if (modes.contains(Mode.Consumer)) { return "Consumer"; } else { return ""; } } public static void clearQueues() throws PersistenceException { CNSEndpointPublisherJobProducer.shutdown(); CNSEndpointPublisherJobConsumer.shutdown(); CNSEndpointPublisherJobConsumer.initialize(); CNSEndpointPublisherJobProducer.initialize(); } public static void start(String mode) throws Exception { Util.initLog4j(); modes = parseMode(mode); logger.info("event=startup version=" + CMBControllerServlet.VERSION + " ip=" + InetAddress.getLocalHost().getHostAddress() + " io_mode=" + CMBProperties.getInstance().getCNSIOMode() + " mode=" + modes); if (modes.contains(Mode.Producer)) { CNSEndpointPublisherJobProducer.initialize(); jobProducers = new CNSPublisherJobThread[CMBProperties.getInstance().getCNSNumEndpointPublisherJobProducers()*CMBProperties.getInstance().getCNSNumPublishJobQueues()]; int idx = 0; for (int i = 0; i < CMBProperties.getInstance().getCNSNumEndpointPublisherJobProducers(); i++) { for (int k=0; k<CMBProperties.getInstance().getCNSNumPublishJobQueues(); k++) { jobProducers[idx] = new CNSPublisherJobThread("CNSEPJobProducer-" + idx, new CNSEndpointPublisherJobProducer(), k); jobProducers[idx].start(); idx++; } } } if (modes.contains(Mode.Consumer)) { CNSEndpointPublisherJobConsumer.initialize(); consumers = new CNSPublisherJobThread[CMBProperties.getInstance().getCNSNumEndpointPublisherJobConsumers()*CMBProperties.getInstance().getCNSNumEndpointPublishJobQueues()]; int idx = 0; for (int i = 0; i<CMBProperties.getInstance().getCNSNumEndpointPublisherJobConsumers(); i++) { for (int k=0; k<CMBProperties.getInstance().getCNSNumEndpointPublishJobQueues(); k++) { consumers[idx] = new CNSPublisherJobThread("CNSEPJobConsumer-" + idx, new CNSEndpointPublisherJobConsumer(), k); consumers[idx].start(); idx++; } } MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName("com.comcast.cns.tools:type=CNSWorkerMonitorMBean"); if (!mbs.isRegistered(name)) { mbs.registerMBean(CNSWorkerMonitor.getInstance(), name); } } } /** * Usage is java <opts> com.comcast.cns.tools.CNSPublisher -role=<comma seperated list of roles> * @param argv * @throws Exception */ public static void main(String argv[]) throws Exception { if (argv.length < 1) { System.out.println("Bad usage"); printUsage(); System.exit(1); } start(argv[0]); } }