MarginaliaSearch/code/common/service
Viktor Lofgren 4baf9527d7 (*) WIP Control GUI redesign, executor-service, multi-node mq
This turned out to be very difficult to do in small isolated steps.

* Design overhaul of the control gui using bootstrap
* Move the actors out of control-service into to a new executor-service, that can be run on multiple nodes
* Add node-affinity to message queue
2023-10-14 12:08:43 +02:00
..
src/main (*) WIP Control GUI redesign, executor-service, multi-node mq 2023-10-14 12:08:43 +02:00
build.gradle (*) Upgrade to JDK21 with preview enabled. 2023-09-24 10:38:59 +02:00
readme.md Embryo of new control process 2023-07-03 10:40:32 +02:00

Service

Contains the base classes for the services. This is where port configuration, and common endpoints are set up.

Creating a new Service

The minimal service needs a MainClass and a Service class.

For proper initiation, the main class should look like this:

public class FoobarMain extends MainClass {

    @Inject
    public FoobarMain(FoobarService service) {}

    public static void main(String... args) {
        init(ServiceId.Foobar, args);

        Injector injector = Guice.createInjector(
                new FoobarModule(), /* optional custom bindings go here */
                new DatabaseModule(),
                new ConfigurationModule(SearchServiceDescriptors.descriptors, 
                        ServiceId.Foobar));

        injector.getInstance(FoobarMain.class);
        
        // set the service as ready so that delayed tasks can be started
        injector.getInstance(Initialization.class).setReady();
    }
}

A service class has a boilerplate set-up that looks like this:

@Singleton
public class FoobarService extends Service {

    @Inject
    public FoobarService(BaseServiceParams params) {
        super(params);
        
        // set up Spark endpoints here
    }
}

Further the new service needs to be added to the ServiceId enum in service-discovery.

Central Classes