This is the base interface used for all services. Services support specific funcationality and work in a transactional context. See {@code TransactionParticipant} for details on when interactionbetween {@code Service}s is allowed.
On startup of an application, services are constructed (see details below). This provides access to the non-transactional core components of the system as well as the other {@code Service}s that have already been created. {@code Service}s are created in a known order based on dependencies: {@code DataService}, {@code WatchdogService}, {@code NodeMappingService}, {@code TaskService}, {@code ClientSessionService}, and the {@code ChannelManager}, finishing with any custom {@code Service}s ordered based on the application's configuration.
All implementations of {@code Service} must have a constructor withparameters of types {@code Properties}, {@code ComponentRegistry}, and {@code TransactionProxy}. This is how the {@code Service} is createdon startup. The {@code Properties} parameter provides application andservice-specific properties. The {@code ComponentRegistry} providesaccess to non-transactional kernel and system components like the {@code TransactionScheduler}. The {@code TransactionProxy} providesaccess to transactional state (when active) and the other available {@code Service}s. If any error occurs in creating a {@code Service}, the constructor may throw any {@code Exception}, causing the application to shutdown.
Note that {@code Service}s are not created in the context of a transaction. If a given constructor needs to do any work transactionally, it may do so by calling {@code TransactionScheduler.runTask}.