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
这个问题已在 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 消息。