事件标记如何在Lagom中运行?

时间:2017-10-22 18:51:09

标签: scala lagom

Lagom reference documentation显示了如何标记事件:

INSERT INTO final_appointments select * from scheduled_appointments where id = @id;

密封特征建议可以标记父事件以按顺序处理所有子项:

  

具有特定标记的所有事件都可以作为顺序使用,   有序的事件流。

所以我们这样做,我们标记了我们的父事件,我们使用光滑实现了一个ReadSideProcessor并且它没有工作。提高日志记录级别,我们看到了一条未处理的消息"我们在object BlogEvent { val BlogEventTag = AggregateEventTag[BlogEvent] } sealed trait BlogEvent extends AggregateEvent[BlogEvent] { override def aggregateTag: AggregateEventTag[BlogEvent] = BlogEvent.BlogEventTag } 中找到了以下内容:

SlickReadSideImpl

如果类与注册处理程序的类完全匹配,则上面的override def handle(): Flow[EventStreamElement[Event], Done, NotUsed] = Flow[EventStreamElement[Event]] .mapAsync(parallelism = 1) { element => val dbAction = eventHandlers.get(element.event.getClass) .map { handler => // apply handler if found handler(element) } .getOrElse { // fallback to empty action if no handler is found if (log.isDebugEnabled) log.debug("Unhandled event [{}]", element.event.getClass.getName) DBIO.successful(()) } .flatMap { _ => // whatever it happens we save the offset offsetDao.updateOffsetQuery(element.offset) } .map(_ => Done) slick.db.run(dbAction.transactionally) } 无法找到任何处理程序,例如它是子类(我们的情况)。

这有点让人困惑:这是理想的行为,还是eventHandlers.get(element.event.getClass)JDBCReadSideImpl实施中的错误?

  • 如果是所需的行为,则不应标记密封的特征事件(可能需要在文档中进行更新)
  • 如果是所需的行为,则JDBCReadSideImpl和SlickReadSideImpl不能使用从classname到handler的映射。

1 个答案:

答案 0 :(得分:1)

这是按预期工作的。期望您将要以不同的方式处理具体的事件类型,因此您将为每个具体类型注册一个处理程序。

使用相同标记标记所有事件子类型的关键是确保在同一实体上的不同类型的事件之间进行排序。例如,如果您有BlogCreatedEventBlogPublishedEvent,那么您可能希望确保您的处理器在发布的事件之前接收创建的事件,即使它以不同方式处理它们。