Java JMS 2.0规范—JMS提供程序如何检测JMS客户端对消息对象的更改?

Java JMS 2.0规范—JMS提供程序如何检测JMS客户端对消息对象的更改?,java,jms,activemq,Java,Jms,Activemq,我正在阅读JMS 2.0规范,其中提到(在相关摘录下面)如果客户机尝试修改消息对象,那么JMS提供程序可能会抛出异常 我的问题是,JMS提供程序如何知道客户机是否试图修改消息对象,因为消息对象将通过线路传输,并且在JMS提供程序端它不是同一个堆对象,所以即使客户机修改该消息对象,JMS提供程序也无法检测到更改 我错过什么了吗 7.3.9。对消息对象使用的限制 执行异步发送的应用程序必须考虑 消息对象设计为可由用户访问的限制 一次控制的逻辑线程,不支持并发 使用。参见第2.14节“多线程” 在se

我正在阅读JMS 2.0规范,其中提到(在相关摘录下面)如果客户机尝试修改消息对象,那么JMS提供程序可能会抛出异常

我的问题是,JMS提供程序如何知道客户机是否试图修改消息对象,因为消息对象将通过线路传输,并且在JMS提供程序端它不是同一个堆对象,所以即使客户机修改该消息对象,JMS提供程序也无法检测到更改

我错过什么了吗

7.3.9。对消息对象使用的限制

执行异步发送的应用程序必须考虑 消息对象设计为可由用户访问的限制 一次控制的逻辑线程,不支持并发 使用。参见第2.14节“多线程”

在send方法完成之后 返回时,应用程序不得尝试读取标头, 消息对象的属性或正文,直到 CompletionListener的onCompletion或OneException方法已被删除 打电话。这是因为JMS提供程序可能正在修改消息 对象在另一个线程中

JMS提供程序可能会抛出 如果应用程序试图访问或修改 在send方法返回之后和 已调用CompletionListener。如果JMS提供程序没有 抛出异常,则行为未定义


本摘录将JMS客户机实现称为此处的JMS提供者,它告诉您,一旦使用异步API调用send,在异步完成收到成功或失败事件通知之前,您将不再控制消息


客户端经常会在send call to标记上使用一个内部“只读”标志,表示消息现在不会被客户端代码触动,并会在send call以某种方式完成后将只读状态重置为read/write。

此文本与您的提供者对JMS对象的实现有关。当从JMS使用者收到此消息时,通常会打开一个只读标志,这也是为了提高性能,当您使用修改消息的方法时,将在“消息”的实现中检查该标志。例如
TextMessage.setText()。