
io.datakernel.launchers.Initializers Maven / Gradle / Ivy
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