MSC Multi-Value Service API
Overview
Background
Complex Injectors and Values Framework
Packages org.jboss.msc.inject and org.jboss.msc.value are over-designed.
Their usage has lead to complex code with non-trivial impact on memory.
Services Provide Single Value
This is limiting and has caused difficulties in some scenarios.
Insufficient Encapsulation
The previous API exposed state machine and implementation details.
Service objects are accessible from any other service.
Proposed API Change
New Services Configuration API
We will introduce new Multi-Value Services API that will
consist of 1 additional interface and 4 additional methods in existing API.
We will introduce org.jboss.msc.Service interface superseding existing
org.jboss.msc.service.Service interface.
We will add 4 new methods to existing API, concretely:
-
org.jboss.msc.service.ServiceTarget
-
<T> ServiceBuilder<T> addService(ServiceName)
-
-
org.jboss.msc.service.ServiceBuilder
-
<V> java.util.function.Supplier<V> requires(ServiceName name) -
<V> java.util.function.Consumer<V> provides(ServiceName… names) -
ServiceBuilder<T> setInstance(Service<T> service)
-
Old Services Configuration API
We will deprecate old Single-Value Services API, concretely:
-
all types in
org.jboss.msc.injectpackage -
all types in
org.jboss.msc.valuepackage -
org.jboss.msc.service.Serviceinterface -
all three
org.jboss.msc.service.ServiceControllervalue retrieval methods -
org.jboss.msc.service.BatchServiceTargetinterface -
org.jboss.msc.service.ServiceController.Substateenum -
org.jboss.msc.service.ServiceController.Transitionenum -
all API methods with deprecated types in its signature
Examples
New API usage example:
ServiceName HTTP_CONFIG = ServiceName.of("http", "config");
ServiceName HTTP_HOST = ServiceName.of("http", "host");
ServiceName HTTP_PORT = ServiceName.of("http", "port");
ServiceName HTTP_SERVER = ServiceName.of("http", "server");
ServiceBuilder configBuilder = serviceContainer.addService(HTTP_CONFIG); Consumer<String> hostInjector = configBuilder.provides(HTTP_HOST); Consumer<Integer> portInjector = configBuilder.provides(HTTP_PORT); configBuilder.setInstance(new HttpConfigService(hostInjector, portInjector)); configBuilder.install();
ServiceBuilder serverBuilder = serviceContainer.addService(HTTP_SERVER); Supplier<String> host = serverBuilder.requires(HTTP_HOST); Supplier<Integer> port = serverBuilder.requires(HTTP_PORT); serverBuilder.setInstance(new HttpServer(host, port)); serverBuilder.install();
Issue Metadata
Issue
Related Issues
Dev Contacts
QE Contacts
Affected Projects or Components
-
All subsystems
Other Interested Projects
Requirements
Hard Requirements
-
Multiple values per service.
-
100% API backward compatibility.
-
100% services interoperability.
Nice-to-Have Requirements
Reduce memory consumption.
Non-Requirements
Test Plan
Ensure that the existing test suite shows no regression in both WildFly Core and WildFly projects.
Unit tests will be added to MSC project ensuring backward compatibility and new functionality.