All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.datakernel.launchers.Initializers Maven / Gradle / Ivy

There is a newer version: 3.1.0
Show newest version
package io.datakernel.launchers;

import io.datakernel.config.Config;
import io.datakernel.eventloop.AbstractServer;
import io.datakernel.eventloop.Eventloop;
import io.datakernel.eventloop.PrimaryServer;
import io.datakernel.http.AsyncHttpServer;
import io.datakernel.remotefs.RemoteFsServer;
import io.datakernel.rpc.server.RpcServer;
import io.datakernel.trigger.TriggerRegistry;
import io.datakernel.trigger.TriggerResult;
import io.datakernel.util.Initializer;
import io.datakernel.util.MemSize;

import java.time.Duration;

import static io.datakernel.config.ConfigConverters.*;
import static io.datakernel.eventloop.Eventloop.DEFAULT_IDLE_INTERVAL;
import static io.datakernel.eventloop.FatalErrorHandlers.rethrowOnAnyError;
import static io.datakernel.http.AsyncHttpServer.DEFAULT_KEEP_ALIVE;
import static io.datakernel.rpc.server.RpcServer.DEFAULT_INITIAL_BUFFER_SIZE;
import static io.datakernel.rpc.server.RpcServer.DEFAULT_MAX_MESSAGE_SIZE;
import static io.datakernel.trigger.Severity.HIGH;
import static io.datakernel.trigger.Severity.WARNING;
import static java.lang.System.currentTimeMillis;

public class Initializers {
	private Initializers() {
	}

	public static > Initializer ofAbstractServer(Config config) {
		return server -> server
				.withListenAddresses(config.get(ofList(ofInetSocketAddress()), "listenAddresses"))
				.withAcceptOnce(config.get(ofBoolean(), "acceptOnce", false))
				.withSocketSettings(config.get(ofSocketSettings(), "socketSettings", server.getSocketSettings()))
				.withServerSocketSettings(config.get(ofServerSocketSettings(), "serverSocketSettings", server.getServerSocketSettings()));

	}

	public static Initializer ofPrimaryServer(Config config) {
		return ofAbstractServer(config);
	}

	public static Initializer ofEventloop(Config config) {
		return eventloop -> eventloop
				.withFatalErrorHandler(config.get(ofFatalErrorHandler(), "fatalErrorHandler", rethrowOnAnyError()))
				.withIdleInterval(config.get(ofDuration(), "idleInterval", DEFAULT_IDLE_INTERVAL))
				.withThreadPriority(config.get(ofInteger(), "threadPriority", 0));
	}

	public static Initializer ofEventloopTriggers(TriggerRegistry triggersRegistry, Config config) {
		return eventloop -> {
			int businessLogicTimeWarning = config.get(ofInteger(), "businessLogicTime.warning", 10);
			int businessLogicTimeHigh = config.get(ofInteger(), "businessLogicTime.high", 100);
			triggersRegistry.add(HIGH, "fatalErrors", () ->
					TriggerResult.ofError(eventloop.getStats().getFatalErrors()));
			triggersRegistry.add(WARNING, "businessLogic", () ->
					TriggerResult.ofValue(eventloop.getStats().getBusinessLogicTime().getSmoothedAverage(),
							businessLogicTime -> businessLogicTime > businessLogicTimeWarning));
			triggersRegistry.add(HIGH, "businessLogic", () ->
					TriggerResult.ofValue(eventloop.getStats().getBusinessLogicTime().getSmoothedAverage(),
							businessLogicTime -> businessLogicTime > businessLogicTimeHigh));
		};
	}

	public static Initializer ofHttpServer(Config config) {
		return server -> server
				.initialize(ofAbstractServer(config))
				.withMaxHttpMessageSize(config.get(ofMemSize(), "maxMessageSize", MemSize.gigabytes(1)))
				.withKeepAliveTimeout(config.get(ofDuration(), "keepAliveTimeout", DEFAULT_KEEP_ALIVE))
				.withReadTimeout(config.get(ofDuration(), "readTimeout", Duration.ZERO))
				.withWriteTimeout(config.get(ofDuration(), "writeTimeout", Duration.ZERO));
	}

	public static Initializer ofHttpWorker(Config config) {
		return worker -> worker
				.withMaxHttpMessageSize(config.get(ofMemSize(), "maxMessageSize", MemSize.gigabytes(1)))
				.withKeepAliveTimeout(config.get(ofDuration(), "keepAliveTimeout", DEFAULT_KEEP_ALIVE))
				.withReadTimeout(config.get(ofDuration(), "readTimeout", Duration.ZERO))
				.withWriteTimeout(config.get(ofDuration(), "writeTimeout", Duration.ZERO));
	}

	public static Initializer ofHttpServerTriggers(TriggerRegistry triggers, Config config) {
		return server -> {
			if (server.getStats() == null) return;
			int servletExceptionTtl = config.get(ofInteger(), "servletException.ttl", 5 * 60);
			double httpTimeoutsThreshold = config.get(ofDouble(), "httpTimeoutsThreshold", 1.0);
			triggers.add(HIGH, "servletExceptions", () ->
					TriggerResult.ofError(server.getStats().getServletExceptions())
							.whenTimestamp(timestamp -> timestamp > currentTimeMillis() - servletExceptionTtl * 1000L));
			triggers.add(WARNING, "httpTimeouts", () ->
					TriggerResult.ofValue(server.getStats().getHttpTimeouts().getSmoothedRate(), timeouts -> timeouts > httpTimeoutsThreshold));
		};
	}

	public static Initializer ofRemoteFsServer(Config config) {
		return server -> server
				.initialize(ofAbstractServer(config));
	}

	public static Initializer ofRemoteFsServerTriggers(TriggerRegistry triggerRegistry, Config config) {
		return server -> {}; // TODO
	}

	public static Initializer ofRpcServer(Config config) {
		return server -> server
				.initialize(ofAbstractServer(config.getChild("rpc.server")))
				.withStreamProtocol(
						config.get(ofMemSize(), "rpc.streamProtocol.defaultPacketSize", DEFAULT_INITIAL_BUFFER_SIZE),
						config.get(ofMemSize(), "rpc.streamProtocol.maxPacketSize", DEFAULT_MAX_MESSAGE_SIZE),
						config.get(ofBoolean(), "rpc.streamProtocol.compression", false))
				.withAutoFlushInterval(config.get(ofDuration(), "rpc.flushDelay", Duration.ZERO));
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy