2016-07-18 6 views
1

akka-persistence의 PersistenceQuery를 사용하여 물건을 관리하는 액터에 초기 상태를로드합니다. 시작시 정확히 한 번 재생하기를 원하지만 로그에 기록을 계속 보냅니다.저널을 정확히 한 번 읽음

14:11:28.405 [rooms-akka.actor.default-dispatcher-4] DEBUG a.p.q.j.l.LiveEventsByPersistenceIdPublisher - request replay for persistenceId [rooms] from [4] to [9223372036854775807] limit [100] 
14:11:28.407 [rooms-akka.actor.default-dispatcher-17] DEBUG a.p.q.j.l.LiveEventsByPersistenceIdPublisher - replay completed for persistenceId [rooms], currSeqNo [4] 
14:11:31.376 [rooms-akka.actor.default-dispatcher-17] DEBUG a.p.q.j.l.LiveEventsByPersistenceIdPublisher - request replay for persistenceId [rooms] from [4] to [9223372036854775807] limit [100] 
14:11:31.377 [rooms-akka.actor.default-dispatcher-17] DEBUG a.p.q.j.l.LiveEventsByPersistenceIdPublisher - replay completed for persistenceId [rooms], currSeqNo [4] 
14:11:34.376 [rooms-akka.actor.default-dispatcher-4] DEBUG a.p.q.j.l.LiveEventsByPersistenceIdPublisher - request replay for persistenceId [rooms] from [4] to [9223372036854775807] limit [100] 
14:11:34.378 [rooms-akka.actor.default-dispatcher-4] DEBUG a.p.q.j.l.LiveEventsByPersistenceIdPublisher - replay completed for persistenceId [rooms], currSeqNo [4] 

여기는 내가 작성하려고하는 프로그램입니다.

implicit val mat = ActorMaterializer()(context) 
val queries = PersistenceQuery(context.system).readJournalFor[LeveldbReadJournal](
     LeveldbReadJournal.Identifier) 
val src: Source[EventEnvelope, NotUsed] = queries.eventsByPersistenceId("rooms", 0L, Long.MaxValue) 
val events: Source[Any, NotUsed] = src.map(_.event) 
val future = events.runWith(Sink.foreach{ 
    case x: RoomCreated => process(x) 
    case x: RoomDeleted => process(x) 
    case x => logger.error(s"Could not spawn $x") 
}) 
+0

해당 로그 문을 생성하는 코드는 어디에 있습니까? 나는 당신이 왜 쿼리가 여러 번 실행되는 것인가를 이해할 수 있도록 좀 더 많은 코드를 보여줄 필요가 있다고 생각한다. – cmbaxter

+0

한 번 배우기 시작한 배우의 미리 시작 – Haito

+0

이 배우의 여러 인스턴스를 시작 했습니까? 아니면 처리 중에 어딘가에서 일어나는 예외에 대한 응답으로 감독자가 다시 시작 했습니까? – cmbaxter

답변

1

나는 당신의 예상 행동의 차이를 생각하고 당신이 실제로보고 된 것은 eventsByPersistenceId는 "라이브"스트림 것입니다. 즉, 제공 한 오프셋 범위에서 시작하는 이벤트를 반환 할뿐만 아니라 (0부터 시작하여 Long.MaxValue로 이동하기 때문에) 모든 이벤트가 반환 될뿐만 아니라 들어오는대로 계속 새 이벤트를 보냅니다. 실시간 스트림을 원한다면 대신 currentEventsByPersistenceId으로 전화를 변경하십시오. 여기에는 해당 시점 (요청을하는 시점)까지만 포함되며 라이브 스트림이 아닙니다. 그것은 당신이 찾고있는 것이어야합니다.