【问题标题】:Spring boot and Akka cluster actor dependency injection not workingSpring Boot 和 Akka 集群 Actor 依赖注入不起作用
【发布时间】:2018-01-04 18:02:40
【问题描述】:

我正在尝试使用 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");

如果我在进程 A 上创建参与者,当然,使用 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();
}

【问题讨论】:

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


    【解决方案1】:

    几乎一整天都这么想。而且我认为没有办法在不改变 Akka Cluster 核心的情况下将 Spring 集成到具有完整 DI 的 Akka 集群中以进行跨集群调用。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      • 2018-06-20
      • 2023-03-21
      • 2017-04-10
      • 1970-01-01
      相关资源
      最近更新 更多