使用 jdbc 死信的持久演员

问题描述

同时使用持久actor和jdbc作为日志。给我的执着演员的所有消息都是死信。但是,我看不出这是什么原因,因为我将它们直接发送给了持久参与者。

持久演员代码

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

  override def 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 Shutdown => context.stop(self)
    case "print"=>println(state)
  }
}

测试代码(所有发送到持久actor的消息都是死信):

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

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

解决方法

死信发生在没有正确运行的 actor 实例时。无论消息被发送到的actor是否是持久actor,传递消息的过程都是一样的。

所以,我想当您向其发送消息时,您的持久角色实际上并未运行。这可能是因为持久性设置没有正确配置。

我使用内存中持久性运行了您的代码(将 Cmd 和 Evt 更改为 String 类型),并且成功了。

,

感谢您的回复!您是否熟悉 jdbc 插件?我配置了日志/快照和与数据库的流畅连接,它似乎符合插件的文档。有什么你可以看到的错误/丢失的东西吗? 应用程序.conf:

(Response) webServiceTemplate
      .marshalSendAndReceive("soap-server",request);

相关问答

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