通过引用来传递消息有效内容:生产者和使用者应用程序的示例代码
编写 JMS 应用程序,以便可安全地通过引用来传递消息有效内容,从而在单个服务器内的生产者和使用者应用程序之间进行异步消息传递。
发送大型对象消息或字节消息时,序列化、反序列化和复制消息有效内容的内存和处理器使用成本可能会很高。 如果生产者和使用者应用程序位于同一 JVM 中,并且您对关联连接工厂和激活规范启用通过引用传递消息有效内容属性,那么可通过引用将消息有效内容从生产者应用程序传递至使用者应用程序。这会减少或绕过数据复制并改进性能和内存使用。
在下图中,消息通过生产者连接工厂从 JMS 生产者应用程序传递至消息传递引擎上的队列。然后它们离开该队列并通过使用者连接工厂或激活规范传递至 JMS 使用者应用程序。
警告:
将定义这些属性所绕过的 JMS 规范的一部分,以确保消息数据完整性。 使用这些属性的任何 JMS 应用程序必须严格遵循所描述的规则,否则会有丧失数据完整性的风险。
图 1. 生产和使用消息

如果对生产者连接工厂启用
producerDoesNotModifyPayloadAfterSet
属性,那么生产者应用程序必须保证将有效内容对象设置到对象或字节消息中后不修改此对象。为帮助您实现此目标,下面提供了一些样本代码,可改写这些代码以在您的应用程序中使用:
DataObject data = new DataObject();
data.setXXX("xxx");
data.setYYY(yyy);
ObjectMessage message = session.createObjectMessage();
message.setObject(data);
data = null;
producer.send(message);
对于字节消息,生产者应用程序还必须保证仅将单个完整字节数组写至消息。为帮助您实现此目标,下面提供了一些样本代码,可改写这些代码以在您的应用程序中使用:byte [] data = myByteData;
BytesMessage message = session.createBytesMessage();
message.writeBytes(data);
data = null;
producer.send(message);
如果对使用者连接工厂或激活规范启用
consumerDoesNotModifyPayloadAfterGet 属性,那么使用者应用程序必须保证不修改它从对象消息获取的有效内容(字节消息的使用不受
consumerDoesNotModifyPayloadAfterGet 属性影响)。为帮助您实现此目标,下面提供了一些样本代码,可改写这些代码以在您的应用程序中使用:
public void onMessage (Message message)
{
ObjectMessage oMessage = (ObjectMessage) message;
DataObject data = oMessage.getObject();
System.out.print(data.getXXX());
System.out.print(data.getYYY());
}