org.moneta.config.dropwizard.MonetaDropwizardApplication.java Source code

Java tutorial

Introduction

Here is the source code for org.moneta.config.dropwizard.MonetaDropwizardApplication.java

Source

/*
 * This software is licensed under the Apache License, Version 2.0
 * (the "License") agreement; 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.moneta.config.dropwizard;

import io.dropwizard.Application;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import net.admin4j.ui.servlets.MemoryMonitorStartupServlet;

import org.apache.commons.lang.ArrayUtils;
import org.eclipse.jetty.servlet.BaseHolder.Source;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.Holder;
import org.eclipse.jetty.servlet.ServletHolder;
import org.force66.correlate.RequestCorrelationFilter;
import org.moneta.MonetaPerformanceFilter;
import org.moneta.MonetaServlet;
import org.moneta.MonetaTopicListServlet;
import org.moneta.config.MonetaConfiguration;

import com.codahale.metrics.JmxReporter;

/**
 * Dropwizard configuration for Moneta
 * @author D. Ashmore
 *
 */
public class MonetaDropwizardApplication extends Application<MonetaDropwizardConfiguration> {

    protected static boolean containsConfiguration(String[] args) {
        for (String arg : args) {
            if (arg.endsWith(".yaml") || arg.endsWith(".yml") || arg.endsWith(".json")) {
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) throws Exception {
        String[] localArgs = args;
        if (!containsConfiguration(args)) {
            // Add default config if nothing specified
            localArgs = (String[]) ArrayUtils.add(args, "/moneta-config.yaml");
        }
        new MonetaDropwizardApplication().run(localArgs);
    }

    @Override
    public void initialize(Bootstrap<MonetaDropwizardConfiguration> bootstrap) {
        bootstrap.setConfigurationSourceProvider(new MonetaConfigurationSourceProvider());
        super.initialize(bootstrap);
    }

    @Override
    public void run(MonetaDropwizardConfiguration configuration, Environment environment) throws Exception {

        /*
         * The ServletHolder allows you to specify init parameters and other
         * servlet configuration itmes in the web.xml. Setting the order means
         * that the servlet is initialized on startup; by default it is not.
         */
        ServletHolder topicHolder = new ServletHolder(Source.EMBEDDED);
        topicHolder.setHeldClass(MonetaServlet.class);
        topicHolder.setInitOrder(0);
        topicHolder.setInitParameter(MonetaServlet.CONFIG_IGNORED_CONTEXT_PATH_NODES, "moneta,topic");
        environment.getApplicationContext().getServletHandler().addServletWithMapping(topicHolder,
                "/moneta/topic/*");

        // Will be initialized on first use by default.
        environment.getApplicationContext().addServlet(MonetaTopicListServlet.class, "/moneta/topics/*");

        /*
         * Install thread contention monitoring -- withdrawn after issue with
         * Jetty discovered.
         */
        // ServletHolder threadContentionHolder = new
        // ServletHolder(Source.EMBEDDED);
        // threadContentionHolder.setHeldClass(ThreadMonitorStartupServlet.class);
        // threadContentionHolder.setInitOrder(0);
        // environment.getApplicationContext()
        // .getServletHandler()
        // .addServlet(threadContentionHolder);

        /*
         * Install memory alert monitoring
         */
        ServletHolder memoryAlertHolder = new ServletHolder(Source.EMBEDDED);
        memoryAlertHolder.setHeldClass(MemoryMonitorStartupServlet.class);
        memoryAlertHolder.setInitOrder(0);
        environment.getApplicationContext().getServletHandler().addServlet(memoryAlertHolder);

        /*
         * Install the performance filter
         */
        FilterHolder perfFilterHolder = new FilterHolder(Holder.Source.EMBEDDED);
        perfFilterHolder.setHeldClass(MonetaPerformanceFilter.class);
        perfFilterHolder.setInitParameter(MonetaPerformanceFilter.PARM_MAX_TRNASACTION_TIME_THRESHOLD_IN_MILLIS,
                "3000");
        environment.getApplicationContext().addFilter(perfFilterHolder, "/moneta/*", null);

        /*
         * Install RequestCorrelation filter so I can get a correlation id in
         * the logs
         */
        FilterHolder correlationFilterHolder = new FilterHolder(Holder.Source.EMBEDDED);
        correlationFilterHolder.setHeldClass(RequestCorrelationFilter.class);

        // Install healthchecks
        MonetaConfiguration config = new MonetaConfiguration();
        for (String checkName : config.getHealthChecks().keySet()) {
            environment.healthChecks().register(checkName, config.getHealthChecks().get(checkName));
        }

        final JmxReporter jmxReporter = JmxReporter.forRegistry(environment.metrics()).build();
        jmxReporter.start();
    }

}