通过引用传递消息有效内容:每个处理步骤的潜在优势
对于 JMS 消息传递应用程序所采取的每个处理步骤,检查此表以了解对关联连接工厂或激活规范启用“通过引用传递消息有效内容”属性何时具有潜在性能优势以及为何具有此优势。
发送大型对象消息或字节消息时,序列化、反序列化和复制消息有效内容的内存和处理器使用成本可能会很高。 如果对连接工厂或激活规范启用通过引用传递消息有效内容属性,请通知缺省消息传递提供程序覆盖 JMS 1.1 规范并可能要减少或绕过此数据复制。
警告:
将定义这些属性所绕过的 JMS 规范的一部分,以确保消息数据完整性。 使用这些属性的所有 JMS 应用程序必须严格遵循“通过引用传递消息有效内容的原因及时间”主题中描述的规则,否则会有丢失数据完整性的风险。
要通过引用传递消息有效内容,对连接工厂和激活规范设置以下属性:
- producerDoesNotModifyPayloadAfterSet(对于连接工厂)或 forwarderDoesNotModifyPayloadAfterSet(对于激活规范)
- 启用此属性后,连接工厂产生的或通过激活规范转发的对象或字节消息设置到消息中时不会被复制,绝对需要时才会序列化。数据设置到消息中后,发送这类消息的应用程序就不能修改数据。
- consumerDoesNotModifyPayloadAfterGet
- 启用此属性后,通过连接工厂或激活规范接收的对象消息在绝对需要时才会序列化。应用程序不能修改从这些消息获取的数据。
处理步骤 | 是否有可能提高性能 | 说明 |
---|---|---|
使用生产者应用程序和使用者应用程序处理对象消息 | ||
对象消息被发送至同一 JVM 中的使用者应用程序。已启用 producerDoesNotModifyPayloadAfterSet 和 consumerDoesNotModifyPayloadAfterGet 属性。 | 是 | 在某些条件下,有效内容对象通过引用传递至使用者应用程序。 如果消息不持久或者未被处理,并且使用者应用程序即时可用,那么有效内容对象可能永远不会序列化。 |
在已启用 producerDoesNotModifyPayloadAfterSet 属性的情况下产生了对象消息,然后未对其启用 consumerDoesNotModifyPayloadAfterGet 属性的使用者应用程序接收到该消息。 | 否 | 因为使用者应用程序未启用 consumerDoesNotModifyPayloadAfterGet 属性,所以未获得任何优势。 |
对象消息被发送至另一 JVM 中的单个使用者应用程序。已启用 producerDoesNotModifyPayloadAfterSet 和 consumerDoesNotModifyPayloadAfterGet 属性。 | 否 | 因为单个使用者应用程序在另一 JVM 中,所以未获得任何优势。 |
都已启用 consumerDoesNotModifyPayloadAfterGet 属性并且都在同一 JVM 中运行的多个使用者应用程序(主题)接收到对象消息。 | 是 | 尽管未做承诺,但已启用 consumerDoesNotModifyPayloadAfterGet 属性的所有使用者应用程序可能接收到对同一对象的引用。 |
使用转发者应用程序处理对象消息 | ||
对象消息被转发并且转发者应用程序访问该消息的有效内容。已启用 consumerDoesNotModifyPayloadAfterGet 和 producer/forwarderDoesNotModifyPayloadAfterSet 属性。 | 是 | 以下情况下可能有性能优势:
|
对象消息被转发并且转发者应用程序访问该消息的有效内容。只启用了 producer/forwarderDoesNotModifyPayloadAfterSet 属性。 | 是 | 如果被转发消息的使用者已启用 consumerDoesNotModifyPayloadAfterGet 属性,并且与转发者应用程序在同一 JVM 中,那么可能有性能优势。 |
对象消息被转发并且转发者应用程序未访问该消息的有效内容。 | 否 | 如果转发者应用程序未访问对象消息的有效内容,那么 producer/forwarderDoesNotModifyPayloadAfterSet 和 consumerDoesNotModifyPayloadAfterGet 属性对转发者应用程序不起作用。从最初生产者和最终使用者应用程序获取的优势被保留。 |
使用调解处理对象消息 | ||
对象消息被发送至已调解服务集成总线目标。 | 否 | 如果对象消息被发送至已调解目标,那么表示未通过启用 producerDoesNotModifyPayloadAfterSet 属性获取任何性能优势。 |
使用使用者应用程序处理字节消息 | ||
字节消息被发送至任何使用者应用程序。已启用 producerDoesNotModifyPayloadAfterSet 属性。 | 是 | 批准将有关设置的数据复制到消息的 JMS 规范部分被绕过,从而保存了字节数据的副本。 |
在启用了 consumerDoesNotModifyPayloadAfterGet 属性的情况下接收到字节消息。 | 否 | JMS API 不允许通过引用将字节数据传递回使用者代码(BytesMessage.readBytes 方法)。 |
都已启用 consumerDoesNotModifyPayloadAfterGet 属性的多个使用者(主题)接收到字节消息。 | 否 | JMS API 不允许通过引用将字节数据传递回使用者代码(BytesMessage.readBytes 方法)。 |
使用转发者应用程序处理字节消息 | ||
字节消息被转发。 | 否 | 未通过启用任何“通过引用传递消息有效内容”属性获取优势。 |