Search in sources :

Example 1 with PEContainer

use of io.s4.processor.PEContainer in project core by s4.

the class MainApp method main.

public static void main(String[] args) throws Exception {
    Options options = new Options();
    options.addOption(OptionBuilder.withArgName("corehome").hasArg().withDescription("core home").create("c"));
    options.addOption(OptionBuilder.withArgName("appshome").hasArg().withDescription("applications home").create("a"));
    options.addOption(OptionBuilder.withArgName("s4clock").hasArg().withDescription("s4 clock").create("d"));
    options.addOption(OptionBuilder.withArgName("seedtime").hasArg().withDescription("event clock initialization time").create("s"));
    options.addOption(OptionBuilder.withArgName("extshome").hasArg().withDescription("extensions home").create("e"));
    options.addOption(OptionBuilder.withArgName("instanceid").hasArg().withDescription("instance id").create("i"));
    options.addOption(OptionBuilder.withArgName("configtype").hasArg().withDescription("configuration type").create("t"));
    CommandLineParser parser = new GnuParser();
    CommandLine commandLine = null;
    String clockType = "wall";
    try {
        commandLine = parser.parse(options, args);
    } catch (ParseException pe) {
        System.err.println(pe.getLocalizedMessage());
        System.exit(1);
    }
    int instanceId = -1;
    if (commandLine.hasOption("i")) {
        String instanceIdStr = commandLine.getOptionValue("i");
        try {
            instanceId = Integer.parseInt(instanceIdStr);
        } catch (NumberFormatException nfe) {
            System.err.println("Bad instance id: %s" + instanceIdStr);
            System.exit(1);
        }
    }
    if (commandLine.hasOption("c")) {
        coreHome = commandLine.getOptionValue("c");
    }
    if (commandLine.hasOption("a")) {
        appsHome = commandLine.getOptionValue("a");
    }
    if (commandLine.hasOption("d")) {
        clockType = commandLine.getOptionValue("d");
    }
    if (commandLine.hasOption("e")) {
        extsHome = commandLine.getOptionValue("e");
    }
    String configType = "typical";
    if (commandLine.hasOption("t")) {
        configType = commandLine.getOptionValue("t");
    }
    long seedTime = 0;
    if (commandLine.hasOption("s")) {
        seedTime = Long.parseLong(commandLine.getOptionValue("s"));
    }
    File coreHomeFile = new File(coreHome);
    if (!coreHomeFile.isDirectory()) {
        System.err.println("Bad core home: " + coreHome);
        System.exit(1);
    }
    File appsHomeFile = new File(appsHome);
    if (!appsHomeFile.isDirectory()) {
        System.err.println("Bad applications home: " + appsHome);
        System.exit(1);
    }
    if (instanceId > -1) {
        System.setProperty("instanceId", "" + instanceId);
    } else {
        System.setProperty("instanceId", "" + S4Util.getPID());
    }
    List loArgs = commandLine.getArgList();
    if (loArgs.size() < 1) {
    // System.err.println("No bean configuration file specified");
    // System.exit(1);
    }
    // String s4ConfigXml = (String) loArgs.get(0);
    // System.out.println("s4ConfigXml is " + s4ConfigXml);
    ClassPathResource propResource = new ClassPathResource("s4_core.properties");
    Properties prop = new Properties();
    if (propResource.exists()) {
        prop.load(propResource.getInputStream());
    } else {
        System.err.println("Unable to find s4_core.properties. It must be available in classpath");
        System.exit(1);
    }
    ApplicationContext coreContext = null;
    String configBase = coreHome + File.separatorChar + "conf" + File.separatorChar + configType;
    String configPath = "";
    List<String> coreConfigUrls = new ArrayList<String>();
    File configFile = null;
    // load clock configuration
    configPath = configBase + File.separatorChar + clockType + "_clock.xml";
    coreConfigUrls.add(configPath);
    // load core config xml
    configPath = configBase + File.separatorChar + "s4_core_conf.xml";
    configFile = new File(configPath);
    if (!configFile.exists()) {
        System.err.printf("S4 core config file %s does not exist\n", configPath);
        System.exit(1);
    }
    coreConfigUrls.add(configPath);
    String[] coreConfigFiles = new String[coreConfigUrls.size()];
    coreConfigUrls.toArray(coreConfigFiles);
    String[] coreConfigFileUrls = new String[coreConfigFiles.length];
    for (int i = 0; i < coreConfigFiles.length; i++) {
        coreConfigFileUrls[i] = "file:" + coreConfigFiles[i];
    }
    coreContext = new FileSystemXmlApplicationContext(coreConfigFileUrls, coreContext);
    ApplicationContext context = coreContext;
    Clock s4Clock = (Clock) context.getBean("clock");
    if (s4Clock instanceof EventClock && seedTime > 0) {
        EventClock s4EventClock = (EventClock) s4Clock;
        s4EventClock.updateTime(seedTime);
        System.out.println("Intializing event clock time with seed time " + s4EventClock.getCurrentTime());
    }
    PEContainer peContainer = (PEContainer) context.getBean("peContainer");
    Watcher w = (Watcher) context.getBean("watcher");
    w.setConfigFilename(configPath);
    // load extension modules
    String[] configFileNames = getModuleConfigFiles(extsHome, prop);
    if (configFileNames.length > 0) {
        String[] configFileUrls = new String[configFileNames.length];
        for (int i = 0; i < configFileNames.length; i++) {
            configFileUrls[i] = "file:" + configFileNames[i];
        }
        context = new FileSystemXmlApplicationContext(configFileUrls, context);
    }
    // load application modules
    configFileNames = getModuleConfigFiles(appsHome, prop);
    if (configFileNames.length > 0) {
        String[] configFileUrls = new String[configFileNames.length];
        for (int i = 0; i < configFileNames.length; i++) {
            configFileUrls[i] = "file:" + configFileNames[i];
        }
        context = new FileSystemXmlApplicationContext(configFileUrls, context);
        // attach any beans that implement ProcessingElement to the PE
        // Container
        String[] processingElementBeanNames = context.getBeanNamesForType(ProcessingElement.class);
        for (String processingElementBeanName : processingElementBeanNames) {
            Object bean = context.getBean(processingElementBeanName);
            try {
                Method getS4ClockMethod = bean.getClass().getMethod("getS4Clock");
                if (getS4ClockMethod.getReturnType().equals(Clock.class)) {
                    if (getS4ClockMethod.invoke(bean) == null) {
                        Method setS4ClockMethod = bean.getClass().getMethod("setS4Clock", Clock.class);
                        setS4ClockMethod.invoke(bean, coreContext.getBean("clock"));
                    }
                }
            } catch (NoSuchMethodException mnfe) {
            // acceptable
            }
            System.out.println("Adding processing element with bean name " + processingElementBeanName + ", id " + ((ProcessingElement) bean).getId());
            peContainer.addProcessor((ProcessingElement) bean);
        }
    }
}
Also used : Options(org.apache.commons.cli.Options) GnuParser(org.apache.commons.cli.GnuParser) ArrayList(java.util.ArrayList) Watcher(io.s4.util.Watcher) Properties(java.util.Properties) EventClock(io.s4.util.clock.EventClock) Clock(io.s4.util.clock.Clock) FileSystemXmlApplicationContext(org.springframework.context.support.FileSystemXmlApplicationContext) ApplicationContext(org.springframework.context.ApplicationContext) ArrayList(java.util.ArrayList) List(java.util.List) CommandLineParser(org.apache.commons.cli.CommandLineParser) EventClock(io.s4.util.clock.EventClock) ProcessingElement(io.s4.processor.ProcessingElement) Method(java.lang.reflect.Method) ClassPathResource(org.springframework.core.io.ClassPathResource) FileSystemXmlApplicationContext(org.springframework.context.support.FileSystemXmlApplicationContext) CommandLine(org.apache.commons.cli.CommandLine) PEContainer(io.s4.processor.PEContainer) ParseException(org.apache.commons.cli.ParseException) File(java.io.File)

Example 2 with PEContainer

use of io.s4.processor.PEContainer in project core by s4.

the class PEContainer method run.

public void run() {
    long startTime, endTime;
    while (true) {
        EventWrapper eventWrapper = null;
        try {
            eventWrapper = workQueue.take();
            if (s4Clock instanceof EventClock) {
                EventClock eventClock = (EventClock) s4Clock;
                eventClock.update(eventWrapper);
            // To what time to update the clock
            }
            if (trackByKey) {
                boolean foundOne = false;
                for (CompoundKeyInfo compoundKeyInfo : eventWrapper.getCompoundKeys()) {
                    foundOne = true;
                    updateCount(eventWrapper.getStreamName() + " " + compoundKeyInfo.getCompoundKey());
                }
                if (!foundOne) {
                    updateCount(eventWrapper.getStreamName() + " *");
                }
            }
            startTime = System.currentTimeMillis();
            if (logger.isDebugEnabled()) {
                logger.debug("STEP 5 (PEContainer): workQueue.take - " + eventWrapper.toString());
            }
            // "Incoming: " + event.getEventName());
            if (monitor != null) {
                monitor.increment(pecontainer_ev_dq_ct.toString(), 1, S4_CORE_METRICS.toString());
            }
            // printPlainPartitionInfoList(event.getCompoundKeyList());
            boolean ctrlEvent = testControlEvent(eventWrapper);
            // execute the PEs interested in this event
            for (int i = 0; i < prototypeWrappers.size(); i++) {
                if (logger.isDebugEnabled()) {
                    logger.debug("STEP 6 (PEContainer): prototypeWrappers(" + i + ") - " + prototypeWrappers.get(i).toString() + " - " + eventWrapper.getStreamName());
                }
                // so.
                if (ctrlEvent) {
                    if (controlEventProcessor != null) {
                        controlEventProcessor.process(eventWrapper, prototypeWrappers.get(i));
                    }
                    continue;
                }
                // otherwise, continue processing event.
                List<EventAdvice> adviceList = adviceLists.get(i);
                for (EventAdvice eventAdvice : adviceList) {
                    if (eventAdvice.getEventName().equals("*") || eventAdvice.getEventName().equals(eventWrapper.getStreamName())) {
                    // event name matches
                    } else {
                        continue;
                    }
                    if (eventAdvice.getKey().equals("*")) {
                        invokePE(prototypeWrappers.get(i).getPE("*"), eventWrapper, null);
                        continue;
                    }
                    for (CompoundKeyInfo compoundKeyInfo : eventWrapper.getCompoundKeys()) {
                        if (eventAdvice.getKey().equals(compoundKeyInfo.getCompoundKey())) {
                            invokePE(prototypeWrappers.get(i).getPE(compoundKeyInfo.getCompoundValue()), eventWrapper, compoundKeyInfo);
                        }
                    }
                }
            }
            endTime = System.currentTimeMillis();
            if (monitor != null) {
                // TODO: need to be changed for more accurate calc
                monitor.increment(pecontainer_exec_elapse_time.toString(), (int) (endTime - startTime), S4_CORE_METRICS.toString());
            }
        } catch (InterruptedException ie) {
            Logger.getLogger("s4").warn("PEContainer is interrupted", ie);
            return;
        } catch (Exception e) {
            Logger.getLogger("s4").error("Exception choosing processing element to run", e);
        }
    }
}
Also used : EventClock(io.s4.util.clock.EventClock) CompoundKeyInfo(io.s4.dispatcher.partitioner.CompoundKeyInfo) EventWrapper(io.s4.collector.EventWrapper)

Aggregations

EventClock (io.s4.util.clock.EventClock)2 EventWrapper (io.s4.collector.EventWrapper)1 CompoundKeyInfo (io.s4.dispatcher.partitioner.CompoundKeyInfo)1 PEContainer (io.s4.processor.PEContainer)1 ProcessingElement (io.s4.processor.ProcessingElement)1 Watcher (io.s4.util.Watcher)1 Clock (io.s4.util.clock.Clock)1 File (java.io.File)1 Method (java.lang.reflect.Method)1 ArrayList (java.util.ArrayList)1 List (java.util.List)1 Properties (java.util.Properties)1 CommandLine (org.apache.commons.cli.CommandLine)1 CommandLineParser (org.apache.commons.cli.CommandLineParser)1 GnuParser (org.apache.commons.cli.GnuParser)1 Options (org.apache.commons.cli.Options)1 ParseException (org.apache.commons.cli.ParseException)1 ApplicationContext (org.springframework.context.ApplicationContext)1 FileSystemXmlApplicationContext (org.springframework.context.support.FileSystemXmlApplicationContext)1 ClassPathResource (org.springframework.core.io.ClassPathResource)1