Spring启动和Akka集群actor依赖注入不起作用

时间:2018-01-04 18:02:40

标签: java spring spring-boot akka akka-cluster

我正在尝试使用Spring启动和akka。我有两个进程并与akka集群通信。只有进程A使用spring boot。

@Autowired
private ActorSystem springActorSystem;

@Autowired
private SpringExtension springExtension;

private ActorRef caActor;
caActor = springActorSystem.actorOf(springExtension.props("clientAgentActor"), "ca");

如果我在进程A上创建actor,当然,使用springExtension,所有注入都有效。但是,caActor是一个集群角色。如果进程B向进程A发送消息,则在某处调用ClientAgentActor,则所有注入都失败。 怎么解决?

@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class ClientAgentActor extends AbstractActor {

private static final Logger logger = LogManager.getLogger(ClientAgentActor.class);

@Autowired
ClientAgentService caService;

@Autowired
LineService lineService;

@Override
public Receive createReceive() {
    //TODO
    return receiveBuilder().match(String.class, msg -> logger.debug(msg)).build();
}

1 个答案:

答案 0 :(得分:0)

几乎整天都这么想。而且我认为没有办法将Spring整合到具有完整DI的Akka集群中,无需更改Akka集群的核心。

当你在一个JVM中没有集群的情况下进行调用时,你可以使用Akka包装器而不是纯粹的Akka。 但是当你在集群中调用时,这个调用是通过没有Spring包装器的纯Akka基础结构在其他节点上接收的,所以这个基础结构不知道Spring actor代理,这就是为什么你看不到注入。

因此,如果您需要在Akka Cluster中使用Spring,则需要使用Spring基础结构包装此库的核心。除了它不容易实现之外,在应用程序架构中遵循Akka规则和约定也很难。例如,注入具有阻塞调用或多线程代码的传递依赖将太容易了。

如果您需要使用一些Spring功能,我认为最好的方法是将Akka基础设施与Spring的基础设施完全分开。在应用程序初始化之后,使用创建的ApplicationContext设置全局静态字段,并使applicationContext.getBean(...)调用它们所需的位置。当然,你可以为此做一个舒适的方法。或者例如带有公共静态字段的类,其中包含所需的bean,这些bean在Spring初始化完成后设置一次。