【问题标题】:How does event tagging work in Lagom?事件标记如何在 Lagom 中工作?
【发布时间】:2017-10-27 14:01:41
【问题描述】:

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

object BlogEvent {
  val BlogEventTag = AggregateEventTag[BlogEvent]
}

sealed trait BlogEvent extends AggregateEvent[BlogEvent] {
  override def aggregateTag: AggregateEventTag[BlogEvent] =
    BlogEvent.BlogEventTag
}

sealed trait 表明可以标记一个父事件以使所有子事件按顺序处理:

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

所以我们就这样走了,我们标记了我们的父事件,我们使用 slick 实现了一个 ReadSideProcessor,但它没有工作。增加日志记录级别,我们看到一条“未处理的消息”,我们在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) 找不到任何处理程序,例如它是一个子类(我们的例子)。

这有点令人困惑:这是期望的行为还是 JDBCReadSideImplSlickReadSideImpl 的实现中的错误?

  • 如果这是所需的行为,则不应标记密封的特征事件(并且可能需要在文档中进行更新)
  • 如果是所需的行为,则 JDBCReadSideImpl 和 SlickReadSideImpl 不能使用从类名到处理程序的映射。

【问题讨论】:

  • 回答了下面的问题,但我还要评论一下:我可以看到一个案例,希望使用部分函数而不是具体类型的映射 -> 处理程序来处理事件。但是,我希望处理超类型并不常见。您能否解释一下您的用例,以便我们更好地理解? (最好发到Google Group 而不是这里。)

标签: scala lagom


【解决方案1】:

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

使用相同标记标记所有事件子类型的目的是确保同一实体上不同类型事件之间的排序。例如,如果您有一个BlogCreatedEvent 和一个BlogPublishedEvent,那么您需要确保您的处理器在发布事件之前接收到创建的事件,即使它处理它们的方式不同。

【讨论】:

  • 知道了,我会在 SlickReadSide / JDBCReadSide 的文档中提交一些小改动
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 2010-10-11
相关资源
最近更新 更多