繁体   English   中英

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

[英]Spring boot and Akka cluster actor dependency injection not working

我正在尝试使用Spring Boot和Akka。 我有两个过程,并与akka集群进行通信。 仅进程A使用Spring Boot。

@Autowired
private ActorSystem springActorSystem;

@Autowired
private SpringExtension springExtension;

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

当然,如果我使用springExtension在进程A上创建actor,则所有注入都可以正常工作。 但是,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 Cluster的核心,就无法将Spring与具有完整DI的Akka群集集成以进行跨群集调用。

当您在一个JVM中进行无群集调用时,请使用Akka包装器,而不是纯Akka。 但是,当您在集群中进行调用时,该调用将由没有Spring包装器的纯Akka基础结构在其他节点上收到,因此该基础结构不了解Spring actor代理,因此您看不到任何注入。

因此,如果您需要Akka Cluster中的Spring,则需要使用Spring基础结构包装此库的核心。 除非实施起来不容易,否则在应用程序体系结构中遵循Akka规则和约定也将非常困难。 例如,注入具有阻塞调用或多线程代码的传递依赖关系太容易了。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM