一、依赖
//akka
compile("com.typesafe.akka:akka-actor_2.12:2.5.22")
compile("com.typesafe.akka:akka-remote_2.12:2.5.22")
compile("com.typesafe.akka:akka-slf4j_2.12:2.5.22")
//JSR 330标准注解
compile("javax.inject:javax.inject:1")
二、配置文件
application.conf
可以与application.yaml
放在一起
akka {
default-dispatcher {
executor="thread-pool-executor"
thread-pool-executor {
core-pool-size-factor=100
core-pool-size-min=100
core-pool-size-max=100
allow-core-timeout=off
max-pool-size-min=100
max-pool-size-max=100
}
}
loggers = ["akka.event.slf4j.Slf4jLogger"]
loglevel = "DEBUG"
}
三、配置akka
@Configuration
public class AkkaConfig {
@Bean
public ActorSystem actorSystem() {
return ActorSystem.create("test-project");
}
}
四、集成spring
public class SpringActorProducer implements IndirectActorProducer {
private final ApplicationContext applicationContext;
private final String actorBeanName;
private final Object[] args;
public SpringActorProducer(ApplicationContext applicationContext, String actorBeanName, Object... args) {
this.applicationContext = applicationContext;
this.actorBeanName = actorBeanName;
this.args = args;
}
@Override
public Actor produce() {
return (Actor) applicationContext.getBean(actorBeanName,args);
}
@Override
public Class<? extends Actor> actorClass() {
return (Class<? extends Actor>) applicationContext.getType(actorBeanName);
}
}
spring来代理
@Component("springExt")
public class SpringExt implements Extension, ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public Props props(String actorBeanName, Object... args) {
return Props.create(SpringActorProducer.class, applicationContext, actorBeanName, args);
}
}
五、使用
@GetMapping("/test")
public String test11() {
ActorRef testActor = actorSystem.actorOf(springExt.props("TestActor"));
testActor.tell("hello akka!", ActorRef.noSender());
return "OK";
}
import akka.actor.UntypedAbstractActor;
import org.springframework.context.annotation.Scope;
import javax.inject.Named;
@Scope("prototype")
@Named("TestActor")
public class TestActor extends UntypedAbstractActor {
@Override
public void onReceive(Object message) throws Throwable {
try {
System.out.println("rev: " + message);
} finally {
getContext().stop(getSelf());
}
}
}