4.9.8. 发布之间的 JMS 序列化行为变化
JMS 1.1 和 JMS 2.0.0 之间更改了 javax.jms.JMSException
的 serialVersionUID
。这意味着,如果 JMSException 或其子
类的实例使用 JMS 1.1 进行序列化,它就无法使用 JMS 2.0.0 进行反序列化。反之亦然。如果 JMSException 实例使用 JMS
2.0.0 序列化,它就无法使用 JMS 1.1 进行反序列化。在这两种情况下,它会引发类似如下的异常:
javax.jms.JMSException: javax.jms.JMSException; local class incompatible: stream classdesc serialVersionUID = 8951994251593378324, local class serialVersionUID = 2368476267211489441
javax.jms.JMSException: javax.jms.JMSException; local class incompatible: stream classdesc serialVersionUID = 8951994251593378324, local class serialVersionUID = 2368476267211489441
这个问题已在 JMS 2.0.1 维护版本中解决。
下表详细介绍了 JBoss EAP 的每个发行版本的 JMS 实施。
JBoss EAP 版本 | JMS 实施 | JMS 版本 |
---|---|---|
6.4 | HornetQ | JMS 1.1 |
7.0 | Apache ActiveMQ Artemis | JMS 2.0.0 |
7.1 及更新的版本 | Apache ActiveMQ Artemis | JMS 2.0.1 或更高版本 |
请注意,在以下情况下,serialVersionUID
不兼容可能会导致迁移问题:
-
如果您使用 JBoss EAP 6.4 客户端发送包含
JMSException
的消息,将消息传递数据迁移到 JBoss EAP 7.0,然后尝试使用 JBoss EAP 7.0 客户端对该消息进行反序列化,则取消序列化将失败,它将引发异常。这是因为 JMS 1.1中的 serialVersionUID
与 JMS 2.0.0 中的 不兼容。 -
如果您使用 JBoss EAP 7.0 客户端发送包含
JMSException
的消息,将您的消息传递数据迁移到 JBoss EAP 7.1 或更高版本,然后尝试使用 JBoss EAP 7.1 或更高版本以降序该消息,则反序列化将失败,它将引发异常。这是因为 JMS 2.0.0中的 serialVersionUID
与 JMS 2.0.1 或更高版本中的 serialVersionUID 不兼容。
请注意,如果您发送一条消息中包含使用 JBoss EAP 6.4 客户端的 JMSException
,将您的消息传递数据迁移到 JBoss EAP 7.1 或更高版本,然后尝试使用 JBoss EAP 7.1 或更高版本的客户端对该消息进行反序列化,因为 JMS 1.1 中的 serialVersionUID
与 JMS 2.0.1 或更高版本中的 serialVersionUID 兼容。
红帽建议您在迁移消息传递数据前执行以下操作:
- 在将消息传递数据从 JBoss EAP 6.4 迁移到 JBoss EAP 7.0 之前,务必先使用包含 JMSExceptions 的所有 JMS 1.1 消息。
- 在将消息传递数据从 JBoss EAP 7.0 迁移到 JBoss EAP 7.1 或更高版本之前,务必先使用包含 JMSExceptions 的所有 JMS 2.0.0 消息。