Akka Spring integration for Java with additional spring factories for actor creation with ease. This approach is based on the original approach by Typesafe found here http://typesafe.com/activator/template/akka-java-spring.
- provides factory method for actor system creation as a spring singleton bean
- provides factory method for actor creation as a spring prototype bean
- provides autowiring of created actors
- router, mailbox and dispatcher can be configured directly via spring
Just define actor system singleton in the spring context using ActorSystemFactoryBean.
<bean id="actorSystem" class="com.github.sabomichal.akkaspringfactory.ActorSystemFactoryBean">
<!-- actor system name -->
<property name="name" value="MyActorSystem"/>
<!-- actor system configuration -->
<property name="config">
<bean class="com.typesafe.config.ConfigFactory" factory-method="load">
<constructor-arg value="akkaActor.conf"/>
</bean>
</property>
</bean>
Enable Spring auto scanning of componnents,
<context:component-scan base-package="..." />
annotate actor with @Actor annotation,
import com.github.sabomichal.akkaspringfactory.Actor;
@Actor
public class MyActor extends UntypedActor {
// additionally inject some dependencies
@Inject
private MyService injectedService;
@Override
public void onReceive(Object message) throws Exception {
// receive method
}
}
and finally create an ActorRef programmatically.
@Inject
private ActorSystem actorSystem;
...
ActorRef myActor = actorSystem.actorOf(SpringProps.create(actorSystem, MyActor.class));
Just create a spring managed actor reference,
<bean id="springManagedActor" class="com.github.sabomichal.akkaspringfactory.ActorFactoryBean">
<!-- actor system reference -->
<property name="actorSystem" ref="actorSystem"/>
<!-- class name of actor to create -->
<property name="actorClass" value="com.github.sabomichal.akkaspringfactory.test.GreetingActor"/>
<!-- bean name of actor to create -->
<!--<property name="actorBeanClass" value=""/>-->
<!-- router configuration -->
<!--<property name="routerConfig">
<bean class="akka.routing.SmallestMailboxPool">
<constructor-arg value="10"/>
</bean>
</property>-->
<!-- mailbox settings -->
<!--<property name="mailbox" value=""/>-->
<!-- dispatcher settings -->
<!--<property name="dispatcher" value=""/>-->
</bean>
and use it as a spring managed dependency wherever you want. And since ActorFactoryBean is producing prototype beans, a new instance of ActorRef is created with all dependencies resolved.
@Inject
private ActorRef springManagedActor;
...
springManagedActor.tell(...);
For detailed examples see the provided unit tests.
If you like it, give it a star, if you don't, please write an issue.