【问题标题】:akka.pattern.AskTimeoutException is thrown while persisting an event持续事件时抛出 akka.pattern.AskTimeoutException
【发布时间】:2020-12-16 16:52:36
【问题描述】:

我刚开始使用 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 事件。

服务实现方法

@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 中不存在

感谢您的帮助。提前谢谢!

【问题讨论】:

  • 在自动生成的 HelloWorld 示例的指导下,将事件放在与服务实现类不同的包中会导致此错误。当我将 HelloWorldEvent 移动到 com.example.helloworld.impl.aggregate.event 的包中时,我开始收到异常。当我将它放回com.example.helloworld.impl 中时,它与HelloWorldServiceImpl 所在的包相同,异常得到解决。即使将访问修饰符更改为 public 也无济于事……有人有解释吗?我希望我能够将类组织成包

标签: java cassandra akka lagom


【解决方案1】:

似乎异常的真正原因是因为我应该添加处理事件的逻辑,如下所示: 在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)
);

【讨论】:

    猜你喜欢
    • 2021-11-23
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2015-01-08
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    相关资源
    最近更新 更多