AbstractBehaviorWithStash是一个用于在Akka actor系统中实现状态机的抽象类。它允许actor在处理消息时临时将消息存储在一个stash对象中,以便稍后再次使用。
示例代码如下:
import akka.actor.typed.Behavior;
import akka.actor.typed.javadsl.*;
import java.util.LinkedList;
public abstract class AbstractBehaviorWithStash extends AbstractBehavior {
private LinkedList stash;
public AbstractBehaviorWithStash(ActorContext context) {
super(context);
this.stash = new LinkedList<>();
}
protected abstract Behavior handleCommand(T message);
protected Behavior stash() {
return Behaviors.same();
}
@Override
public final Receive createReceive() {
return newReceiveBuilder()
.onMessage(T.class, message -> {
Behavior next = handleCommand(message);
if (next == null) {
return this;
} else if (stash.isEmpty()) {
return next;
} else {
T msg = stash.poll();
return Behaviors.same().unsafeCast(newReceiveBuilder()
.onMessage(msg.getClass(), m -> {
Behavior updated = next.narrow().apply(m);
if (stash.isEmpty()) {
return updated;
} else {
return stash();
}
})
.build());
}
})
.build();
}
protected final void stash(T message) {
stash.add(message);
}
protected final void unstash() {
if (!stash.isEmpty()) {
T msg = stash.poll();
getContext().getSelf().unsafeUpcast().tell(msg);
}
}
protected final void unstashAll() {
while (!stash.isEmpty()) {
unstash();
}
}
}
该类继承了Akka的抽象类AbstractBehavior,并实现了ActorContext接口。它有一个名为stash的LinkedList对象,用于存储actor处理的未处理消息。
handleCommand()方法是抽象方法,需要由子类实现。它接收一个类型为T的消息并返回一个
上一篇:Akka 异步行为测试
下一篇:Akka-actor遇到java.lang.NoClassDefFoundError: akka/actor/CoordinatedShutdown$$anonfun$totalTimeout异常。