java - 持续事件时抛出 akka.pattern.AskTimeoutException
问题描述
我刚从 Lagom & Akka 开始。我正在使用 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事件。
服务实现方法
@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)));
}
我能够确认以下内容:
- 期间抛出异常
persist()
- 该事件在 Cassandra 中不存在
感谢您的帮助。先感谢您!
解决方案
看来异常的真正原因是因为我应该添加处理事件的逻辑如下:在中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)
);
推荐阅读
- powershell - PowerShell - 选择带小数点分隔符的数字 (DB2 SQL)
- c# - 从数据库中选择记录并显示相应行值的值
- c++ - 是否将 std::string 中的额外数据 memcopy 到 std::array
未定义的行为? - huawei-mobile-services - HMS Core Site Kit集成后使用textSearch接口报错码010010
- batch-file - 批量跳过可选参数
- ios - 如何从服务器获取最新的 firebase 用户身份验证数据?
- jsf - 如何在 p:calendar 的更改/日期选择时更新模型
- command-line-interface - 如何在 XC32 编译器中使用 SAMC21 控制器上的软件复位指令填充未使用的内存?
- arrays - 如何在 Python 中获取数组的子形状?
- python-3.x - K-Means 聚类 超参数调优