Fuse Mediation Router provides a simple way to invoke OSGi services using the Bean language. This feature is automatically available whenever a Fuse Mediation Router application is deployed into an OSGi container and requires no special configuration.
When a Fuse Mediation Router route is deployed into the OSGi container, the
CamelContext
automatically sets up a registry chain for resolving
bean instances: the registry chain consists of the OSGi registry, followed by the
blueprint (or Spring) registry. Now, if you try to reference a particular bean class
or bean instance, the registry resolves the bean as follows:
Look up the bean in the OSGi registry first. If a class name is specified, try to match this with the interface or class of an OSGi service.
If no match is found in the OSGi registry, fall back on the blueprint registry (or the Spring registry, if you are using the Spring-DM container).
Consider the OSGi service defined by the following Java interface, which defines
the single method, getGreeting()
:
// Java package org.fusesource.example.hello.boston; public interface HelloBoston { public String getGreeting(); }
When defining the bundle that implements the HelloBoston
OSGi
service, you could use the following blueprint configuration to export the
service:
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<bean id="hello" class="org.fusesource.example.hello.boston.HelloBostonImpl"/>
<service ref="hello" interface="org.fusesource.example.hello.boston.HelloBoston"/>
</blueprint>
Where it is assumed that the HelloBoston
interface is implemented by
the HelloBostonImpl
class (not shown).
After you have deployed the bundle containing the HelloBoston
OSGi
service, you can invoke the service from a Fuse Mediation Router application using the Java DSL.
In the Java DSL, you invoke the OSGi service through the Bean language, as
follows:
from("timer:foo?period=5000")
.bean(org.fusesource.example.hello.boston.HelloBoston.class, "getGreeting")
.log("The message contains: ${body}")
In the bean
command, the first argument is the OSGi interface or
class, which must match the interface exported from the OSGi service bundle. The
second argument is the name of the bean method you want to invoke. For full details
of the bean
command syntax, see Bean Integration in Implementing Enterprise Integration Patterns.
![]() | Note |
---|---|
When you use this approach, the OSGi service is implicitly imported. It is not necessary to import the OSGi service explicitly in this case. |
In the XML DSL, you can also use the Bean language to invoke the
HelloBoston
OSGi service, but the syntax is slightly different. In
the XML DSL, you invoke the OSGi service through the Bean language, using the
method
element, as follows:
<beans ...>
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="timer:foo?period=5000"/>
<setBody>
<method ref="org.fusesource.example.hello.boston.HelloBoston"
method="getGreeting"/>
</setBody>
<log message="The message contains: ${body}"/>
</route>
</camelContext>
</beans>
![]() | Note |
---|---|
When you use this approach, the OSGi service is implicitly imported. It is not necessary to import the OSGi service explicitly in this case. |