Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法在具有自定义用户guardian的ActorSystem上从外部创建顶级actor[clusterSingletonManager]_Java_Akka - Fatal编程技术网

Java 无法在具有自定义用户guardian的ActorSystem上从外部创建顶级actor[clusterSingletonManager]

Java 无法在具有自定义用户guardian的ActorSystem上从外部创建顶级actor[clusterSingletonManager],java,akka,Java,Akka,我正在开发一个使用Akka持久性进行事件源的服务。到目前为止,我们已经成功地将事件存储在Cassandra杂志中。现在我们想通过利用Akka持久性查询来实现CQRS。作为第一种方法,我们试图遵循集群单例模式,让一个参与者通过标记流式处理存储的事件。现在,我们有一个相当简单的演员包装成一个单身: public class EventProcessor extends AbstractLoggingActor { private static final Logger LOG = LoggerF

我正在开发一个使用Akka持久性进行事件源的服务。到目前为止,我们已经成功地将事件存储在Cassandra杂志中。现在我们想通过利用Akka持久性查询来实现CQRS。作为第一种方法,我们试图遵循集群单例模式,让一个参与者通过标记流式处理存储的事件。现在,我们有一个相当简单的演员包装成一个单身:

public class EventProcessor extends AbstractLoggingActor {
  private static final Logger LOG = LoggerFactory.getLogger(EventProcessor.class);

  private final CassandraReadJournal journal;

  public EventProcessor(ActorSystem system) {
    journal =
        PersistenceQuery.get(system)
            .getReadJournalFor(CassandraReadJournal.class, CassandraReadJournal.Identifier());

    journal
        .eventsByTag(OnBoardingBehavior.ENTITY_TYPE_KEY.name(), Offset.noOffset())
        .map(EventEnvelope::persistenceId)
        .to(Sink.foreach(this::logMessage))
        .run(system);
  }

  private void logMessage(String id) {
    LOG.info(String.format("########## Received persistenceId %s", id));
  }

  @Override
  public Receive createReceive() {
    return null;
  }
}
    ClusterSingleton singleton = ClusterSingleton.get(context.getSystem());

    singleton.init(
        SingletonActor.of(EventProcessor.create(identityRequestAdapter), "eventProcessor"));
这就是我们如何将演员包装在《卫报》中:

    akka.actor.ActorSystem classicSystem = context.getSystem().classicSystem();

    ClusterSingletonManagerSettings settings =
        ClusterSingletonManagerSettings.create(classicSystem);

    Props clusterSingletonManagerProps =
        ClusterSingletonManager.props(
            Props.create(EventProcessor.class, classicSystem),
            PoisonPill.getInstance(),
            settings);

    classicSystem.actorOf(clusterSingletonManagerProps, "clusterSingletonManager");
当我们运行服务时,会出现以下异常(在actorOf行上):

java.lang.UnsupportedOperationException:无法在具有自定义用户guardian的ActorSystem上从外部创建顶级actor[clusterSingletonManager]
在akka.actor.ActorSystemImpl.actorOf(ActorSystem.scala:900)
在r.service.onboard.actor.Guardian.initializeEventProcessor(Guardian.java:95)中
在r.service.onboarding.actor.Guardian.(Guardian.java:56)
在r.service.onboard.actor.Guardian.lambda$create$745d95f3$1(Guardian.java:66)
在akka.actor.typed.javadsl.Behaviors$.$anonfun$setup$1(Behaviors.scala:47)
在a.a.t.i.BehaviorImpl$DeferredBehavior$$anon$1.apply(BehaviorImpl.scala:118)
在akka.actor.typed.Behavior$.start(Behavior.scala:168)
在a.a.t.i.InterceptorImpl$$anon$1.开始时(InterceptorImpl.scala:48)
在akka.actor.typed.BehaviorInterceptor.aroundStart(BehaviorInterceptor.scala:55)
在a.a.typed.internal.InterceptorImpl.preStart(InterceptorImpl.scala:71)
在a.a.typed.internal.InterceptorImpl$.$anonfun$apply$1(InterceptorImpl.scala:28)
在a.a.t.i.BehaviorImpl$DeferredBehavior$$anon$1.apply(BehaviorImpl.scala:118)
在akka.actor.typed.Behavior$.start(Behavior.scala:168)
在akka.actor.typed.Behavior$.explain(Behavior.scala:275)
在akka.actor.typed.Behavior$.interpretMessage(Behavior.scala:230)
at a.a.t.internal.adapter.ActoradPter.handleMessage(ActoradPter.scala:126)
在a.a.t.internal.adapter.ActoradPter.aroundReceive(ActoradPter.scala:106)上
在akka.actor.ActorCell.receiveMessage(ActorCell.scala:573)
在akka.actor.ActorCell.invoke(ActorCell.scala:543)
在akka.dispatch.Mailbox.processMailbox(Mailbox.scala:269)
在akka.dispatch.Mailbox.run(Mailbox.scala:230)
在akka.dispatch.Mailbox.exec(Mailbox.scala:242)
... 不包括5帧
我想说的是,我们可以从同一个守护者中产生其他演员,比如:

ActorRef<Command> actorRef =
        context.spawn(OnBoardingBehavior.create(uuid), "OnBoardingBehavior-" + uuid);
ActorRef ActorRef=
spawn(OnBoardingBehavior.create(uuid),“OnBoardingBehavior-”+uuid);

我对Akka完全陌生,因此任何帮助都将不胜感激

终于明白了。显然,当在类型化系统中运行时,我不能使用
ClusterSingletonManager.props
的旧的非类型化方法。我在这里找到了打字系统的正确方法:

所以我的演员现在是一个抽象的行为:

public class EventProcessor extends AbstractBehavior<Void>

太好了,你弄明白了!对于类型化的actor系统,有一个用于内部事物的逃生舱口,允许从外部创建系统级actor,
systemactrof
。不过,这只能在内部或由库使用。
    ClusterSingleton singleton = ClusterSingleton.get(context.getSystem());

    singleton.init(
        SingletonActor.of(EventProcessor.create(identityRequestAdapter), "eventProcessor"));