From d2658d6f84cde648655c1be6e87803c0a8c8b2ae Mon Sep 17 00:00:00 2001 From: Viktor Lofgren Date: Tue, 16 Apr 2024 13:25:15 +0200 Subject: [PATCH] (sys) Add springboard service that can spawn multiple different marginalia services to make distribution easier. --- .../single-service-runner/build.gradle | 33 +++++++++++++ .../java/nu/marginalia/SingleService.java | 49 +++++++++++++++++++ settings.gradle | 1 + 3 files changed, 83 insertions(+) create mode 100644 code/services-core/single-service-runner/build.gradle create mode 100644 code/services-core/single-service-runner/java/nu/marginalia/SingleService.java diff --git a/code/services-core/single-service-runner/build.gradle b/code/services-core/single-service-runner/build.gradle new file mode 100644 index 00000000..bec9eb54 --- /dev/null +++ b/code/services-core/single-service-runner/build.gradle @@ -0,0 +1,33 @@ +plugins { + id 'java' + id 'application' + id 'jvm-test-suite' +} + +application { + mainClass = 'nu.marginalia.SingleService' + applicationName = 'marginalia' +} + +tasks.distZip.enabled = false + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(22)) + } +} + +apply from: "$rootProject.projectDir/srcsets.gradle" + +dependencies { + implementation project(':code:services-core:query-service') + implementation project(':code:services-core:index-service') + implementation project(':code:services-core:control-service') + implementation project(':code:services-core:executor-service') + + testImplementation libs.bundles.slf4j.test + testImplementation libs.bundles.junit + testImplementation libs.mockito + +} + diff --git a/code/services-core/single-service-runner/java/nu/marginalia/SingleService.java b/code/services-core/single-service-runner/java/nu/marginalia/SingleService.java new file mode 100644 index 00000000..5a793a0d --- /dev/null +++ b/code/services-core/single-service-runner/java/nu/marginalia/SingleService.java @@ -0,0 +1,49 @@ +package nu.marginalia; + +public class SingleService { + enum Service { + IndexService("index", "nu.marginalia.index.IndexMain"), + ControlService("control", "nu.marginalia.control.ControlMain"), + ExecutorService("executor", "nu.marginalia.executor.ExecutorMain"), + QueryService("query", "nu.marginalia.query.QueryMain"), + ; + + public final String name; + public final String className; + + Service(String name, String className) { + this.name = name; + this.className = className; + } + + /** Call the main method of the service class */ + public void run(String[] args) { + try { + // Use reflection to call the main method of the service class to avoid + // loading all classes at startup time, which would invoke a bunch of contradictory + // static initializers + + Class clazz = Class.forName(className); + clazz.getMethod("main", String[].class).invoke(null, (Object) args); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + public static void main(String... args) { + if (args.length == 0) { + System.out.println("Usage: SingleService [args...]"); + } + + String serviceName = args[0]; + String[] serviceArgs = new String[args.length - 1]; + System.arraycopy(args, 1, serviceArgs, 0, serviceArgs.length); + + for (var service : Service.values()) { + if (service.name.equals(serviceName)) { + service.run(serviceArgs); + } + } + } +} diff --git a/settings.gradle b/settings.gradle index cfee1a8b..6571020c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -5,6 +5,7 @@ include 'code:services-core:assistant-service' include 'code:services-core:control-service' include 'code:services-core:query-service' include 'code:services-core:executor-service' +include 'code:services-core:single-service-runner' include 'code:services-application:search-service' include 'code:services-application:api-service'