Scala Akka流从Cassandra中过滤出特定事件

Scala Akka流从Cassandra中过滤出特定事件,scala,akka,akka-stream,akka-persistence,akka-persistent-fsm,Scala,Akka,Akka Stream,Akka Persistence,Akka Persistent Fsm,我目前有一个由Akka和Cassandra支持的事件源服务。这是一个名为AuctionService的投标系统,在某个时候,我需要检索名为BiddenOnLot的最后一个投标事件。为此,我使用了akka持久性查询 这是我目前的代码: // obtain read journal by plugin id val readJournal = PersistenceQuery(context.system).readJournalFor[CassandraReadJo

我目前有一个由Akka和Cassandra支持的事件源服务。这是一个名为AuctionService的投标系统,在某个时候,我需要检索名为
BiddenOnLot
的最后一个投标事件。为此,我使用了
akka持久性查询

这是我目前的代码:

        // obtain read journal by plugin id
        val readJournal = PersistenceQuery(context.system).readJournalFor[CassandraReadJournal](
          "cassandra-query-journal")

        // issue query to journal
        val source: Source[EventEnvelope, NotUsed] = readJournal.eventsByPersistenceId(self.path.name.toString, 0, Long.MaxValue)

        // materialize stream, consuming events
        implicit val mat = ActorMaterializer()

        source.runForeach(envelope ⇒ {
          if (envelope.event.isInstanceOf[BiddenOnLot]) {
            val biddenOnLot = envelope.event.asInstanceOf[BiddenOnLot]
            if (biddenOnLot.paddleId == paddleId) {
               // TODO: get last bid event by paddle id
            }
          }
        })

到目前为止,我循环了所有事件,并可以确定其类型。但我确实在努力隔离最后一次出价事件,并能够异步使用它。有什么想法吗?

您可以通过使用模式匹配来解构发出的
事件信封
并将其映射到您想要的事件:

source.map {
    case EventEnvelope(_, _, _, bidenOnLot: BidenOnLot) if bidenOnLot.paddleId == paddleId => bidenOnLot
}.runForeach(println)