Lagom / Akka读边处理器

时间:2018-09-24 12:55:53

标签: akka-persistence lagom

我已经实现了一个读取侧处理器来放置已处理的事件并维护读取侧cassandra表。但是,发现事件源在一段时间后因该错误而失败。

[error] a.a.OneForOneStrategy - com.syn.common.akka.message.drive.CItem; local class incompatible: stream classdesc serialVersionUID = -2252861520543301684, local class serialVersionUID = -3725205170570257368
java.io.InvalidClassException: com.syn.common.akka.message.drive.CItem; local class incompatible: stream classdesc serialVersionUID = -2252861520543301684, local class serialVersionUID = -3725205170570257368
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:699) ~[na:1.8.0_181]
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1885) ~[na:1.8.0_181]
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751) ~[na:1.8.0_181]
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2042) ~[na:1.8.0_181]
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573) ~[na:1.8.0_181]
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431) ~[na:1.8.0_181]
    at scala.collection.immutable.List$SerializationProxy.readObject(List.scala:479) ~[scala-library-2.11.8.jar:1.0.4]
    at sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source) ~[na:na]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181]

CItem的类从一开始就没有改变。但是readsideProcessor无法反序列化事件。.很少有事件被处理并将其存储在表中。

case class CItem(q: JsValue, a: JsValue, d: Option[JsValue])

object CItem {
  implicit val format: Format[CItem] = Json.format[CItem]
}


object UDSerializerRegistry extends JsonSerializerRegistry {
  override def serializers: Seq[JsonSerializer[_]] = Seq(
    JsonSerializer[CRecord]
  )
}

并且CRecord包含CItems列表

1 个答案:

答案 0 :(得分:1)

当在akka-persistence中对消息进行反序列化时,如果二进制不兼容,则会出现您看到的错误。

鉴于您的消息在其字段中使用play-json(我强烈不建议这样做),很可能已更改了项目中使用的play-json的版本,这破坏了消息类的二进制兼容性。

为避免这种情况,我会将您的代码重构为不使用消息字段中的play-json。它将您紧密地绑定到Lagom内部使用的JSON库,因此,当Lagom升级时,您可能会遇到着色问题,或更实际地,会遇到二进制兼容性问题。

如果您决定重构事件,则可以找到事件模式迁移here的指南。