Java akka将普通事物集中到一个地方

Java akka将普通事物集中到一个地方,java,inheritance,akka,Java,Inheritance,Akka,我正在使用javaakka框架。我的一些演员会在onreceive方法中做同样的事情。有没有办法避免这种情况,并将他们带到一个共同的位置。(可能正在使用继承) 具体问题如下 在某些参与者中,它根据条件发送ack消息。这封信 由另一个参与者发送到外部系统 这在几个类中重复 由于参与者的接收块是一个部分函数,因此可以将接收块与或ELSE链接起来。这有助于在参与者之间共享行为,在的Scala版本中有描述,但在Java中也可以这样做 下面是一个使用继承的简单示例,其中公共确认行为是在基类中定义的。但是

我正在使用javaakka框架。我的一些演员会在onreceive方法中做同样的事情。有没有办法避免这种情况,并将他们带到一个共同的位置。(可能正在使用继承)

具体问题如下

  • 在某些参与者中,它根据条件发送ack消息。这封信 由另一个参与者发送到外部系统
  • 这在几个类中重复

由于参与者的
接收
块是一个部分函数,因此可以将
接收
块与
或ELSE
链接起来。这有助于在参与者之间共享行为,在的Scala版本中有描述,但在Java中也可以这样做

下面是一个使用继承的简单示例,其中公共确认行为是在基类中定义的。但是,您不必使用继承,可以在任何需要的地方定义
Receive
块:

import akka.actor.AbstractActor;
import akka.event.Logging;
import akka.event.LoggingAdapter;

public class AckingActor extends AbstractActor {
    private final LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this);

    public static class Msg1 {}
    public static class Ack {}

    @Override
    public Receive createReceive() {
        return receiveBuilder()
            .match(Msg1.class, m -> getSender().tell(new Ack(), getSelf()))
            .matchAny(m -> log.info("unknown message"))
            .build();
    }
}
共享acking行为的参与者可以扩展基类:

import akka.actor.AbstractActor;

public class AckingProducer extends AckingActor {
    private AbstractActor.Receive producerBehavior;

    public AckingProducer() {
        producerBehavior =
            receiveBuilder()
                .matchEquals("foo", m -> getSender().tell("bar", getSelf()))
                .matchEquals("ping", m -> getSender().tell("pong", getSelf()))
                .build();
    }

    @Override
    public Receive createReceive() {
        return producerBehavior.orElse(super.createReceive());
                            // ^ chain the Receive blocks with orElse
                            // e.g., behavior1.orElse(behavior2).orElse(behavior3)
    }
}

您可以链接任意数量的
Receive
块。请注意,如果有多个分部函数处理同一消息,则匹配的第一个分部函数(即匹配的
orElse
链中的第一个
Receive
块)将处理该消息。

我将避免继承,并考虑将actor接口放入库中,然后使用组合将必要的UTIL/服务类包含在参与者中。