Как отладить JournalFailureException в Akka Persistence без первопричины

Я пытаюсь отладить следующее сообщение об ошибке, поскольку ошибка не печатает основную причину, поэтому трудно отладить, в чем здесь проблема. Я попытался изменить тайм-ауты, однако проблема, похоже, не устранена.

  Supervisor StopSupervisor saw failure: Exception during recovery. Last known sequence number [0]. PersistenceId [first], due to: Replay timed out, didn't get event within [60000 milliseconds], highest sequence number seen [0]
akka.persistence.typed.internal.JournalFailureException: Exception during recovery. Last known sequence number [0]. PersistenceId [first], due to: Replay timed out, didn't get event within [60000 milliseconds], highest sequence number seen [0]
    at akka.persistence.typed.internal.ReplayingEvents.onRecoveryFailure(ReplayingEvents.scala:263)

Я вижу следующий журнал до истечения времени ожидания. Означает ли это, что в моей конфигурации есть проблема?

2020-11-20 12:21:55,999 WAR Persistence               No default snapshot store configured! To configure a default snapshot-store plugin set the `akka.persistence.snapshot-store.plugin` key. For details see 'reference.conf'
2020-11-20 12:21:56,070 WAR HikariConfig              slick.db - using dataSourceClassName and ignoring jdbcUrl.
2020-11-20 12:21:56,073 INF HikariDataSource          slick.db - Starting...
2020-11-20 12:21:56,109 INF HikariDataSource          slick.db - Start completed.

Вот мой application.conf

akka {
  loglevel = DEBUG

  persistence {
    journal.plugin = "jdbc-journal"
    snapshot-store.plugin = "jdbc-snapshot-store"
  }
}

jdbc-journal {
  slick = ${slick}
}

jdbc-snapshot-store {
  slick = ${slick}
}

jdbc-read-journal {
  slick = ${slick}
}


slick {
  profile = "slick.jdbc.MySQLProfile$"
  db {
    dataSourceClass = "slick.jdbc.DriverDataSource"
    driver = "com.mysql.cj.jdbc.Driver"
    url = "jdbc:mysql://localhost:3306/"
    user = nilu
    password = "password"
  }
}

person user_1357    schedule 20.11.2020    source источник


Ответы (1)


Используйте метод onPersistFailure. Этот метод вызывается, если сохранение не удалось. Актер будет сутулиться. Лучше всего через некоторое время снова запустить актор и использовать супервизора Backoff.

и используйте метод onPersistRejected. Этот метод вызывается, если JOURNAl не может сохранить событие. Актер возобновил работу. (ссылка)

class MyPersistentActor extends PersistentActor with ActorLogging {
    override def persistenceId: String = ???
    override def receiveCommand: Receive = ???
    override def receiveRecover: Receive = ???

    override def onPersistFailure(cause: Throwable, event: Any, seqNr: Long): Unit = {
      log.error(s"fail to persist $event because of: $cause")
      super.onPersistFailure(cause, event, seqNr)
    }

    override def onPersistRejected(cause: Throwable, event: Any, seqNr: Long): Unit = {
      log.error(s"persist rejected for $event because of: $cause")
      super.onPersistRejected(cause, event, seqNr)
    }
  }
person Felipe    schedule 23.11.2020