如何解决持续事件时引发akka.pattern.AskTimeoutException
我刚开始是Lagom&Akka。我正在遵循 Domain Modelling with Akka Persistence Typed
中描述的设计我正在尝试创建实体(EntityState
)的全新实例。但是事件没有持续存在,并且出现以下错误:
00:54:27.862 [error] com.example.impl.entity.EntityClass [persistencePhase=running-cmd,akkaAddress=akka://XXX@127.0.0.1:60685,akkaSource=akka://XXX/system/sharding/StateClass/186/ID1,sourceActorSystem=XXX,persistenceId=StateClass|ID1] - Supervisor StopSupervisor saw failure: null
java.lang.NullPointerException: null
at akka.persistence.typed.javadsl.EventSourcedBehavior.$anonfun$apply$4(EventSourcedBehavior.scala:195)
at akka.persistence.typed.internal.Running$RunningState.applyEvent(Running.scala:78)
at akka.persistence.typed.internal.Running$HandlingCommands.applyEffects(Running.scala:153)
at akka.persistence.typed.internal.Running$HandlingCommands.onCommand(Running.scala:123)
at akka.persistence.typed.internal.Running$HandlingCommands.onMessage(Running.scala:105)
at akka.persistence.typed.internal.Running$HandlingCommands.onMessage(Running.scala:100)
at akka.actor.typed.scaladsl.AbstractBehavior.receive(AbstractBehavior.scala:83)
我有一个 Create 命令,该命令调用onCreate()
,并最终尝试保留 EntityCreated 事件。
服务Impl方法
@Override
public ServiceCall<CreateMessage,StateView> createState(){
return message ->
entityRef(message.getName())
.<EntityClass.Accepted>ask(replyTo -> new EntityClass.Create(message,replyTo),askTimeout)
.thenApply(accepted -> toStateView(accepted.getSummary()));
}
命令处理程序:
private ReplyEffect<Event,StateClass> onCreate(StateClass state,Create cmd) {
return Effect()
.persist(new EntityCreated(cmd.getDetails().getName(),Instant.now()))
.thenReply(cmd.replyTo,e -> new Accepted(EntityClass.toSummary(e)));
}
我能够确认以下内容:
-
在
- 异常
- 该事件在Cassandra中不存在
persist()
期间抛出感谢您的帮助。预先谢谢你!
解决方法
该异常的真正原因似乎是因为我应该添加如下所述的事件处理逻辑:
在helloEvents()
中,我需要添加类似于以下内容的逻辑:
if (eventAndOffset.first() instanceof HelloEvent.GreetingMessageChanged) {
HelloEvent.GreetingMessageChanged messageChanged = (HelloEvent.GreetingMessageChanged) eventAndOffset.first();
eventToPublish = new GreetingMessageChanged(messageChanged.getName(),messageChanged.getMessage());
}
此外,在集合的eventHandler()
中,我需要添加类似于以下内容的逻辑:
builder.forAnyState()
.onEvent(GreetingMessageChanged.class,(state,evt) ->
// We simply update the current state to use the greeting message from
// the event.
state.withMessage(evt.message)
);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。