Spring 启动和 Akka 集群参与者依赖项注入不起作用



我正在尝试使用Spring boot和akka。我有两个进程并与 akka 集群通信。只有进程 A 使用弹簧引导。

@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();
}

几乎一整天都在想同样的事情。而且我认为如果不更改 Akka 集群的核心,就无法将 Spring 集成到具有完整 DI 的 Akka 集群中进行跨集群调用。

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

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

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

最新更新