Dependency Manager - Leveraging the shell
The shell bundle for the dependency manager extends the gogo shell with one new command called "dm". This command can be used to get insight in the actual components and services in a running OSGi framework.
Typing help help dm
in the gogo shell gives an overview of the available command options.
dm - List dependency manager components scope: dependencymanager flags: compact, cp Displays components using a compact form nodeps, nd Hides component dependencies notavail, na Only displays unavailable components stats, stat, st Displays components statistics wtf Detects where are the root failures options: bundleIds, bid, bi, b <List of bundle ids or bundle symbolic names to display (comma separated)> [optional] componentIds, cid, ci <List of component identifiers to display (comma separated)> [optional] components, c <Regex(s) used to filter on component implementation class names (comma separated), can be negated using "!" prefix> [optional] services, s <OSGi filter used to filter some service properties> [optional] top <Max number of top components to display (0=all)> This command displays components callbacks (init/start) times> [optional] parameters: CommandSession
Usage examples
Below are some examples for typical usage of the dependency manager shell commands. The examples are based on a simple component model with a dashboard which has a required dependency on four probes (temperature, humidity, radiation, pressure). The radiation probe requires a Sensor service but this sensor is not available.
List all dependency manager components
dm
Sample output:
[9] dm.demo [6] dm.demo.Probe(type=radiation) unregistered dm.demo.Sensor service required unavailable [7] dm.demo.Probe(type=humidity) registered [9] dm.demo.impl.Dashboard unregistered dm.demo.Probe (type=temperature) service required available dm.demo.Probe (type=radiation) service required unavailable dm.demo.Probe (type=humidity) service required available dm.demo.Probe (type=pressure) service required available [5] dm.demo.Probe(type=temperature) registered [8] dm.demo.Probe(type=pressure) registered
All components are listed including the dependencies and the availability of these dependencies. The top level element is the bundle and below are the components registered with that bundle’s bundle context. The lowest level is that of the component’s dependencies.
[bundleid] bundle [component id] component interfaces (service properties) dependency <availability>
The following flags can be used to tailor the output:
-
compact, cp
shortens package names and dependencies and therefore gives a more compressed output. -
nodeps, nd
omits the dependencies from the output. -
notavail, na
filters out all components that are registered wich results in the output only containing those components that are in the unregistered state due to one or more unsatisfied required dependencies. This is the command option most used when using the dependency manager shell commands.
Sample output for dm na
:
[9] dm.demo [14] dm.demo.impl.Dashboard unregistered dm.demo.Probe (type=radiation) service required unavailable [11] dm.demo.Probe(type=radiation) unregistered dm.demo.Sensor service required unavailable
The flags can be used in conjunction with the other command options.
Find all components for a given classname
dm c .*ProbeImpl
dm c
or components
finds all components for which the classname of the implementation matches the regular expression.
Find all services matching a service filter
dm s "(type=temperature)"
dm s
allows finding components based on the service properties of their registered services in the service registry using a standard OSGi service filter.
Find out why components are not registered
dm wtf
Sample output:
2 missing dependencies found. ----------------------------- The following service(s) are missing: * dm.demo.Sensor is not found in the service registry
wtf
gives the root cause for components not being registered and therefore their services not being available.
In a typical application components have dependencies on services implemented by components that have dependencies on services etcetera.
This transitivity means that an entire chain of components could be unregistered due to a (few) root dependencies not being satisfied.
wtf
is about discovering those dependencies.