diff --git a/akka-samples/akka-sample-camel/src/main/resources/context-standalone.xml b/akka-samples/akka-sample-camel/src/main/resources/context-standalone.xml index f0932ce1b3..36645a936d 100644 --- a/akka-samples/akka-sample-camel/src/main/resources/context-standalone.xml +++ b/akka-samples/akka-sample-camel/src/main/resources/context-standalone.xml @@ -1,11 +1,24 @@ +http://scalablesolutions.se/akka/akka-0.10.xsd +http://camel.apache.org/schema/spring +http://camel.apache.org/schema/spring/camel-spring.xsd"> + + + + + + + + + + diff --git a/akka-samples/akka-sample-camel/src/main/scala/StandaloneApplication.scala b/akka-samples/akka-sample-camel/src/main/scala/StandaloneApplication.scala index aa4292696a..b7e834fcba 100644 --- a/akka-samples/akka-sample-camel/src/main/scala/StandaloneApplication.scala +++ b/akka-samples/akka-sample-camel/src/main/scala/StandaloneApplication.scala @@ -59,24 +59,16 @@ class StandaloneApplicationRoute extends RouteBuilder { object StandaloneSpringApplication { def main(args: Array[String]) { - import CamelContextManager.context + import CamelContextManager._ - // use Spring application context as active object registry - val springctx = new ClassPathXmlApplicationContext("/context-standalone.xml") - val registry = new ApplicationContextRegistry(springctx) - - // customize CamelContext - CamelContextManager.init(new DefaultCamelContext(registry)) - CamelContextManager.context.addRoutes(new StandaloneSpringApplicationRoute) - - // start CamelService - val camelService = CamelService.newInstance.load + // load Spring application context + val appctx = new ClassPathXmlApplicationContext("/context-standalone.xml") // access 'externally' registered active objects with active-object component - assert("hello msg3" == context.createProducerTemplate.requestBody("direct:test3", "msg3")) + assert("hello msg3" == template.requestBody("direct:test3", "msg3")) - // shutdown CamelService - camelService.unload + // destroy Spring application context + appctx.close // shutdown all (internally) created actors ActorRegistry.shutdownAll diff --git a/akka-spring/src/main/resources/se/scalablesolutions/akka/spring/akka-0.10.xsd b/akka-spring/src/main/resources/se/scalablesolutions/akka/spring/akka-0.10.xsd index c81fb12af3..9047b7c588 100644 --- a/akka-spring/src/main/resources/se/scalablesolutions/akka/spring/akka-0.10.xsd +++ b/akka-spring/src/main/resources/se/scalablesolutions/akka/spring/akka-0.10.xsd @@ -229,6 +229,16 @@ + + + + + + + + + + @@ -239,4 +249,7 @@ + + + diff --git a/akka-spring/src/main/scala/ActiveObjectFactoryBean.scala b/akka-spring/src/main/scala/ActiveObjectFactoryBean.scala index b6a51138dc..b4bc8795fc 100644 --- a/akka-spring/src/main/scala/ActiveObjectFactoryBean.scala +++ b/akka-spring/src/main/scala/ActiveObjectFactoryBean.scala @@ -46,8 +46,12 @@ class ActiveObjectFactoryBean extends AbstractFactoryBean[AnyRef] with Logging { /* * @see org.springframework.beans.factory.FactoryBean#getObjectType() */ - def getObjectType: Class[AnyRef] = target.toClass - + def getObjectType: Class[AnyRef] = try { + target.toClass + } catch { + // required by contract to return null + case e: ClassNotFoundException => null + } /* * @see org.springframework.beans.factory.config.AbstractFactoryBean#createInstance() diff --git a/akka-spring/src/main/scala/AkkaNamespaceHandler.scala b/akka-spring/src/main/scala/AkkaNamespaceHandler.scala index 88f2b4c81b..466dbeca30 100644 --- a/akka-spring/src/main/scala/AkkaNamespaceHandler.scala +++ b/akka-spring/src/main/scala/AkkaNamespaceHandler.scala @@ -15,5 +15,6 @@ class AkkaNamespaceHandler extends NamespaceHandlerSupport { registerBeanDefinitionParser(ACTIVE_OBJECT_TAG, new ActiveObjectBeanDefinitionParser()); registerBeanDefinitionParser(SUPERVISION_TAG, new SupervisionBeanDefinitionParser()); registerBeanDefinitionParser(DISPATCHER_TAG, new DispatcherBeanDefinitionParser()); + registerBeanDefinitionParser(CAMEL_SERVICE_TAG, new CamelServiceBeanDefinitionParser); } } diff --git a/akka-spring/src/main/scala/AkkaSpringConfigurationTags.scala b/akka-spring/src/main/scala/AkkaSpringConfigurationTags.scala index 39cb09dd64..5e927ceba1 100644 --- a/akka-spring/src/main/scala/AkkaSpringConfigurationTags.scala +++ b/akka-spring/src/main/scala/AkkaSpringConfigurationTags.scala @@ -16,6 +16,7 @@ object AkkaSpringConfigurationTags { val SUPERVISION_TAG = "supervision" val DISPATCHER_TAG = "dispatcher" val PROPERTYENTRY_TAG = "property" + val CAMEL_SERVICE_TAG = "camel-service" // active-object sub tags val RESTART_CALLBACKS_TAG = "restart-callbacks" @@ -30,6 +31,9 @@ object AkkaSpringConfigurationTags { // dispatcher sub tags val THREAD_POOL_TAG = "thread-pool" + // camel-service sub tags + val CAMEL_CONTEXT_TAG = "camel-context" + // --- ATTRIBUTES // // active object attributes diff --git a/akka-spring/src/main/scala/CamelServiceBeanDefinitionParser.scala b/akka-spring/src/main/scala/CamelServiceBeanDefinitionParser.scala new file mode 100644 index 0000000000..f22e035b95 --- /dev/null +++ b/akka-spring/src/main/scala/CamelServiceBeanDefinitionParser.scala @@ -0,0 +1,33 @@ +/** + * Copyright (C) 2009-2010 Scalable Solutions AB + */ +package se.scalablesolutions.akka.spring + +import org.springframework.beans.factory.support.BeanDefinitionBuilder +import org.springframework.beans.factory.xml.{ParserContext, AbstractSingleBeanDefinitionParser} +import org.springframework.util.xml.DomUtils +import org.w3c.dom.Element + +import se.scalablesolutions.akka.spring.AkkaSpringConfigurationTags._ + + +/** + * @author Martin Krasser + */ +class CamelServiceBeanDefinitionParser extends AbstractSingleBeanDefinitionParser { + override def doParse(element: Element, parserContext: ParserContext, builder: BeanDefinitionBuilder) { + + // TODO: make camel-context element optional + + val camelContextElement = DomUtils.getChildElementByTagName(element, CAMEL_CONTEXT_TAG); + if (camelContextElement eq null) return + val camelContextReference = camelContextElement.getAttribute("ref") + builder.addPropertyReference("camelContext", camelContextReference) + + // ... + } + + override def getBeanClass(element: Element): Class[_] = classOf[CamelServiceFactoryBean] + + override def shouldGenerateIdAsFallback = true +} \ No newline at end of file diff --git a/akka-spring/src/main/scala/CamelServiceFactoryBean.scala b/akka-spring/src/main/scala/CamelServiceFactoryBean.scala new file mode 100644 index 0000000000..3f8f1797ca --- /dev/null +++ b/akka-spring/src/main/scala/CamelServiceFactoryBean.scala @@ -0,0 +1,35 @@ +/** + * Copyright (C) 2009-2010 Scalable Solutions AB + */ +package se.scalablesolutions.akka.spring + +import org.apache.camel.CamelContext +import org.springframework.beans.factory.{DisposableBean, InitializingBean, FactoryBean} +import se.scalablesolutions.akka.camel.{CamelContextManager, CamelService} + +/** + * @author Martin Krasser + */ +class CamelServiceFactoryBean extends FactoryBean[CamelService] with InitializingBean with DisposableBean { + @scala.reflect.BeanProperty var camelContext: CamelContext = _ + + var instance: CamelService = _ + + def isSingleton = true + + def getObjectType = classOf[CamelService] + + def getObject = instance + + def afterPropertiesSet = { + if (camelContext ne null) { + CamelContextManager.init(camelContext) + } + instance = CamelService.newInstance + instance.load + } + + def destroy = { + instance.unload + } +} \ No newline at end of file diff --git a/project/build/AkkaProject.scala b/project/build/AkkaProject.scala index cb5eefc23f..12c94ffaa3 100644 --- a/project/build/AkkaProject.scala +++ b/project/build/AkkaProject.scala @@ -75,7 +75,7 @@ class AkkaParent(info: ProjectInfo) extends DefaultProject(info) { lazy val akka_http = project("akka-http", "akka-http", new AkkaHttpProject(_), akka_core, akka_camel) lazy val akka_camel = project("akka-camel", "akka-camel", new AkkaCamelProject(_), akka_core) lazy val akka_persistence = project("akka-persistence", "akka-persistence", new AkkaPersistenceParentProject(_)) - lazy val akka_spring = project("akka-spring", "akka-spring", new AkkaSpringProject(_), akka_core) + lazy val akka_spring = project("akka-spring", "akka-spring", new AkkaSpringProject(_), akka_core, akka_camel) lazy val akka_jta = project("akka-jta", "akka-jta", new AkkaJTAProject(_), akka_core) lazy val akka_kernel = project("akka-kernel", "akka-kernel", new AkkaKernelProject(_), akka_core, akka_http, akka_spring, akka_camel, akka_persistence, akka_amqp)