AKKA持久actor在接收命令函数中不接收命令消息

问题描述

我正在尝试将 AKKA 持久性与 JDBC 插件一起使用。但是,在试验持久性 Actor 时,我面临的问题是我的持久性 Actor 没有收到它应该收到的消息。

这是我用于 JDBC 插件的 application.conf 文件

akka {
  loglevel = DEBUG

  actor {
    #provider = cluster
  }

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

  jdbc-journal {
  slick = ${slick}
}

# the akka-persistence-snapshot-store in use
jdbc-snapshot-store {
  slick = ${slick}
}

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

  slick {
  profile = "slick.jdbc.MysqLProfile$"
  dataSourceClass = "slick.jdbc.DriverDataSource"
  db {
  dataSourceClass = "slick.jdbc.DriverDataSource"
  driver = "com.MysqL.cj.jdbc.Driver"
  url = "jdbc:MysqL://localhost:3306/db_persistence"
  user = "root"
  password = ""
  numThreads = 5
  maxConnections = 5
  minConnections = 1
}
}

这是我的持久actor的代码(基于AKKA文档代码

case class Cmd(data: String)
case class Evt(data: String)

case class ExampleState(events: List[String] = Nil) {
  def updated(evt: Evt): ExampleState = copy(evt.data :: events)
  def size: Int = events.length
  override def toString: String = events.reverse.toString
}

class ExampleActor extends PersistentActor {
  override def persistenceId = "sample-id-1"

   var state = ExampleState()

  def updateState(event: Evt): Unit = {
    state = state.updated(event)
  }

  def numEvents =
    state.size

  override def receiveRecover: Receive = {
    case evt: Evt                                 => updateState(evt)
    case SnapshotOffer(_,snapshot: ExampleState) => state = snapshot
  }

  val snapShotInterval = 1000

  val receiveCommand: Receive = {
    case Cmd(data) => {
      println("in the command code block")
      persist(Evt(s"${data}-${numEvents}")) { event => {
        updateState(event)
        context.system.eventStream.publish(event)
        if (lastSequenceNr % snapShotInterval == 0 && lastSequenceNr != 0)
          saveSnapshot(state)
      }
      }
    }
    case "print"=>println(state)
  }
}

最后,我发现问题的地方。

"The persistent actor" should {
    "Receive Command" in {
      val persistentActor = system.actorOf(Props[ExampleActor](),"persistentActorOne")
      Thread.sleep(2000)
      println("before the send")
      persistentActor ! Cmd("foo")
      persistentActor ! Cmd("bar")
      persistentActor ! Cmd("fizz")
      persistentActor ! Cmd("buzz")
      persistentActor ! "print"

      Thread.sleep(10000)
      println("after messages should be sent and received")
    }
  }
}

有人能看到我的持久演员收不到我的消息/命令的原因吗?

提前致谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...