我已经实现了一个读取侧处理器来放置已处理的事件并维护读取侧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列表
答案 0 :(得分:1)
当在akka-persistence中对消息进行反序列化时,如果二进制不兼容,则会出现您看到的错误。
鉴于您的消息在其字段中使用play-json(我强烈不建议这样做),很可能已更改了项目中使用的play-json的版本,这破坏了消息类的二进制兼容性。>
为避免这种情况,我会将您的代码重构为不使用消息字段中的play-json。它将您紧密地绑定到Lagom内部使用的JSON库,因此,当Lagom升级时,您可能会遇到着色问题,或更实际地,会遇到二进制兼容性问题。
如果您决定重构事件,则可以找到事件模式迁移here的指南。