【问题标题】:JMS 2.0 specs - how a JMS provider can detect the change in Message object by a JMS client?JMS 2.0 规范 - JMS 提供者如何检测 JMS 客户端对 Message 对象的更改?
【发布时间】:2017-11-14 05:07:12
【问题描述】:

我正在阅读 JMS 2.0 规范,并且提到(在相关摘录下方)如果客户端尝试修改 Message 对象,则 JMS 提供程序可能会引发异常。

我的问题是 JMS 提供者如何知道客户端是否正在尝试修改消息对象,因为消息对象将通过线路传输,并且在 JMS 提供者端它不是同一个堆对象,因此即使客户端修改了该消息对象,JMS 提供者无法检测到更改。

我错过了什么吗?

7.3.9。 Message 对象的使用限制

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

send 方法之后 返回时,应用程序不得尝试读取标头, Message 对象的属性或正文,直到 CompletionListener 的 onCompletion 或 onException 方法已 叫。这是因为 JMS 提供者可能正在修改消息 在此期间另一个线程中的对象。

JMS 提供者可能会抛出一个 如果应用程序尝试访问或修改 在 send 方法返回之后和之前的消息对象 CompletionListener 已被调用。如果 JMS 提供程序不 抛出异常,则行为未定义。

【问题讨论】:

    标签: java jms activemq


    【解决方案1】:

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

    【讨论】:

    • 感谢您抽出宝贵时间回答。
    【解决方案2】:

    此摘录在这里将 JMS 客户端实现称为 JMS 提供者,它告诉您,一旦您使用异步 API 调用发送,您将不再控制消息,直到异步完成被成功通知或失败事件。

    客户端通常会在发送调用中使用内部“只读”标志来标记消息现在不会被客户端代码触及,并且会在之后将只读状态重置为读/写send 调用以一种或另一种方式完成。

    【讨论】:

      猜你喜欢
      • 2016-09-01
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      相关资源
      最近更新 更多