diff --git a/akka-camel/src/main/resources/META-INF/services/org/apache/camel/component/active-object b/akka-camel/src/main/resources/META-INF/services/org/apache/camel/component/active-object new file mode 100644 index 0000000000..5dd88a0671 --- /dev/null +++ b/akka-camel/src/main/resources/META-INF/services/org/apache/camel/component/active-object @@ -0,0 +1 @@ +class=se.scalablesolutions.akka.camel.component.ActiveObjectComponent \ No newline at end of file diff --git a/akka-camel/src/main/scala/CamelContextLifecycle.scala b/akka-camel/src/main/scala/CamelContextLifecycle.scala index 61e45d435f..66646eed57 100644 --- a/akka-camel/src/main/scala/CamelContextLifecycle.scala +++ b/akka-camel/src/main/scala/CamelContextLifecycle.scala @@ -94,14 +94,14 @@ trait CamelContextLifecycle extends Logging { * caching they can do so after this method returned and prior to calling start. * This method also registers a new * {@link se.scalablesolutions.akka.camel.component.ActiveObjectComponent} at - * context under the name actobj. + * context under a name defined by ActiveObjectComponent.InternalSchema. */ def init(context: CamelContext) { this.activeObjectComponent = new ActiveObjectComponent this.activeObjectRegistry = activeObjectComponent.activeObjectRegistry this.context = context this.context.setStreamCaching(true) - this.context.addComponent(ActiveObjectComponent.DefaultSchema, activeObjectComponent) + this.context.addComponent(ActiveObjectComponent.InternalSchema, activeObjectComponent) this.template = context.createProducerTemplate _initialized = true log.info("Camel context initialized") diff --git a/akka-camel/src/main/scala/ConsumerPublisher.scala b/akka-camel/src/main/scala/ConsumerPublisher.scala index 723c41fff3..9df41a7d92 100644 --- a/akka-camel/src/main/scala/ConsumerPublisher.scala +++ b/akka-camel/src/main/scala/ConsumerPublisher.scala @@ -144,7 +144,7 @@ private[camel] class ConsumerActorRoute(endpointUri: String, id: String, uuid: B * @author Martin Krasser */ private[camel] class ConsumerMethodRoute(val endpointUri: String, id: String, method: String) extends ConsumerRoute(endpointUri, id) { - protected override def targetUri = "%s:%s?method=%s" format (ActiveObjectComponent.DefaultSchema, id, method) + protected override def targetUri = "%s:%s?method=%s" format (ActiveObjectComponent.InternalSchema, id, method) } /** diff --git a/akka-camel/src/main/scala/component/ActiveObjectComponent.scala b/akka-camel/src/main/scala/component/ActiveObjectComponent.scala index 2be93c404c..d65c7e6528 100644 --- a/akka-camel/src/main/scala/component/ActiveObjectComponent.scala +++ b/akka-camel/src/main/scala/component/ActiveObjectComponent.scala @@ -16,15 +16,14 @@ object ActiveObjectComponent { /** * Default schema name for active object endpoint URIs. */ - val DefaultSchema = "actobj" + val InternalSchema = "active-object-internal" } /** * Camel component for exchanging messages with active objects. This component - * requires that active objects are added to activeObjectRegistry - * before creating routes that access these objects. The registry key is the bean - * name of the active object used in the endpoint URI. - * + * tries to obtain the active object from the activeObjectRegistry + * first. If it's not there it tries to obtain it from the CamelContext's registry. + * * @see org.apache.camel.component.bean.BeanComponent * * @author Martin Krasser @@ -69,8 +68,10 @@ class ActiveObjectHolder(activeObjectRegistry: Map[String, AnyRef], context: Cam /** * Obtains an active object from activeObjectRegistry. */ - override def getBean: AnyRef = - activeObjectRegistry.get(getName) + override def getBean: AnyRef = { + val bean = activeObjectRegistry.get(getName) + if (bean eq null) super.getBean else bean + } } /** diff --git a/akka-camel/src/test/scala/component/ActiveObjectComponentFeatureTest.scala b/akka-camel/src/test/scala/component/ActiveObjectComponentFeatureTest.scala index 9239673df2..1decc24eef 100644 --- a/akka-camel/src/test/scala/component/ActiveObjectComponentFeatureTest.scala +++ b/akka-camel/src/test/scala/component/ActiveObjectComponentFeatureTest.scala @@ -28,27 +28,27 @@ class ActiveObjectComponentFeatureTest extends FeatureSpec with BeforeAndAfterAl } feature("Communicate with an active object from a Camel application using active object endpoint URIs") { - import ActiveObjectComponent.DefaultSchema + import ActiveObjectComponent.InternalSchema import CamelContextManager.template import ExchangePattern._ scenario("in-out exchange with proxy created from interface and method returning String") { - val result = template.requestBodyAndHeader("%s:intf?method=m2" format DefaultSchema, "x", "test", "y") + val result = template.requestBodyAndHeader("%s:intf?method=m2" format InternalSchema, "x", "test", "y") assert(result === "m2impl: x y") } scenario("in-out exchange with proxy created from class and method returning String") { - val result = template.requestBodyAndHeader("%s:base?method=m2" format DefaultSchema, "x", "test", "y") + val result = template.requestBodyAndHeader("%s:base?method=m2" format InternalSchema, "x", "test", "y") assert(result === "m2base: x y") } scenario("in-out exchange with proxy created from class and method returning void") { - val result = template.requestBodyAndHeader("%s:base?method=m5" format DefaultSchema, "x", "test", "y") + val result = template.requestBodyAndHeader("%s:base?method=m5" format InternalSchema, "x", "test", "y") assert(result === "x") // returns initial body } scenario("in-only exchange with proxy created from class and method returning String") { - val result = template.send("%s:base?method=m2" format DefaultSchema, InOnly, new Processor { + val result = template.send("%s:base?method=m2" format InternalSchema, InOnly, new Processor { def process(exchange: Exchange) = { exchange.getIn.setBody("x") exchange.getIn.setHeader("test", "y") @@ -60,7 +60,7 @@ class ActiveObjectComponentFeatureTest extends FeatureSpec with BeforeAndAfterAl } scenario("in-only exchange with proxy created from class and method returning void") { - val result = template.send("%s:base?method=m5" format DefaultSchema, InOnly, new Processor { + val result = template.send("%s:base?method=m5" format InternalSchema, InOnly, new Processor { def process(exchange: Exchange) = { exchange.getIn.setBody("x") exchange.getIn.setHeader("test", "y")