Delayed Components in Dependency Manager
----------------------------------------
Key: FELIX-2994
URL: https://issues.apache.org/jira/browse/FELIX-2994
Project: Felix
Issue Type: Improvement
Components: Dependency Manager
Reporter: Pierre De Rop
Priority: Minor
This issue proposes a lightweight implementation for the support of "delayed
components" in Dependency Manager.
(see patch attached to this issue).
It allows components to delay their possibly expensive activation until they
are really used, and allows
Dependency Manager to instantiate/initialize components only as needed.
For system where many services are installed, and where not every services are
actually used, then this feature
can significantly speed up startup time, especially when some unused components
require an expensive
processing from their "init" / "start" methods.
A new "setDelayed(boolean)" method has been added in the Component interface,
and also a new "delayed" state
has been added in the ComponentDeclaration, allowing to browse delayed
components from the DM shell.
Here is a code example which defines a delayed component:
dm.add(createComponent()
.setImplementation(DelayedServiceImpl.class)
.setInterface(DelayedService.class.getName, null)
.setDelayed(true));
Implementation notes
--------------------------
- By default, components are not delayed (as before).
- A new DelayedComponentTest has been added in the test sub-project
- This implementation is simple and is not intrusive: DM core classes *have
not* been modified
(excepts a micro-modif in ComponentImpl.java, and in
ComponentDeclaration.java). Basically,
we track every service listeners, and when a listener is matching a
delayed component, then
the component is started. Else, the component is not started, hence
avoiding the useless component
instantiation/initialization.
- A new state has been added in the ComponentDeclaration class
(STATE_DELAYED), allowing to track
delayed components from the Dependency Manager shell.
- The new filter index recently introduced in DM has not yet been used, but
it might be useful to
integrate it in the delayed component manager, since the DM indexer
greatly speeds up service listeners lookup,
especially when using many (thousands) of services. But this enhancement
could be done in a next step.
- The ListenerHook (from ServiceHook specification) is used for the
implementation: this allows to trigger the
activation of DM delayed components not only using DependencyManager
dependencies, but also using other libraries,
like Declarative Service, iPOJO, blueprint, or even ServiceTracker. This
is important because
in our environment, we are using both dependency manager and Declarative
Service, and we need to be able to
activate a delayed DM component from a Declarative Service "Reference"
dependency. ListenerHook
allows to do this because using ListenerHook, we are able to track every
service listeners registered in the framework.
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira