Message 属性

下面概括了 Message 对象属性,并提供了指向更详细参考信息的链接。

表 1. Message 属性
属性的名称 描述
JMS_IBM_CHARACTER_SET XMS 客户机将消息转发到其预期目标时,消息主体中的字符数据字符串所在的编码字符集或代码页的标识 (CCSID)。 在 XMS中,此属性具有数字值并映射到 CCSID。 但是,此属性基于 JMS 属性,因此具有字符串类型值并映射到表示此数字 CCSID 的 Java 字符集。
JMS_IBM_ENCODING XMS 客户机将消息转发到其预期目标时,如何表示消息体中的数字数据。
JMS_IBM_EXCEPTIONMESSAGE 用于描述为何将消息发送到异常目标的文本。 此属性是只读属性。
JMS_IBM_EXCEPTIONPROBLEMDESTINATION 消息在发送到异常目标之前所处目标的名称。
JMS_IBM_EXCEPTIONREASON 用于指示为何将消息发送到异常目标的原因码。
JMS_IBM_EXCEPTIONTIMESTAMP 将消息发送到异常目标的时间。
JMS_IBM_FEEDBACK 用于指示报告消息性质的代码。
JMS_IBM_FORMAT 消息中应用程序数据的性质。
JMS_IBM_LAST_MSG_IN_GROUP 指示消息是否是消息组中的最后一条消息。
JMS_IBM_MSGTYPE 消息的类型。
JMS_IBM_PUTAPPLTYPE 发送消息的应用程序类型。
JMS_IBM_PUTDATE 发送消息的日期。
JMS_IBM_PUTTIME 发送消息的时间。
JMS_IBM_REPORT_COA 请求“到达时确认”报告消息,并指定报告消息中必须包含的原始消息的应用程序数据量。
JMS_IBM_REPORT_COD 请求“传递时确认”报告消息,并指定报告消息中必须包含的原始消息的应用程序数据量。
JMS_IBM_REPORT_DISCARD_MSG 请求在无法将消息传递到其预期目标时丢弃此消息。
JMS_IBM_REPORT_EXCEPTION 请求异常报告消息,并指定报告消息中必须包含的原始消息的应用程序数据量。
JMS_IBM_REPORT_EXPIRATION 请求到期报告消息,并指定报告消息中必须包含的原始消息的应用程序数据量。
JMS_IBM_REPORT_NAN 请求负面操作通知报告消息。
JMS_IBM_REPORT_PAN 请求正面操作通知报告消息。
JMS_IBM_REPORT_PASS_CORREL_ID 请求任何报告或应答消息的相关标识与原始消息的相关标识相同。
JMS_IBM_REPORT_PASS_MSG_ID 请求任何报告或应答消息的消息标识与原始消息的消息标识相同。
JMS_IBM_RETAIN 设置此属性可指示队列管理器将消息视作“保留发布”。
JMS_IBM_SYSTEM_MESSAGEID 用于在服务集成总线内唯一识别消息的标识。 此属性是只读属性。
JMSX_APPID 发送消息的应用程序名称。
JMSX_DELIVERY_COUNT 尝试传递消息的次数。
JMSX_GROUPID 消息所属消息组的标识。
JMSX_GROUPSEQ 消息在消息组中的序号。
JMSX_USERID 与发送消息的应用程序相关联的用户标识。

JMS_IBM_MQMD* 属性

IBM® Message Service Client for .NET 支持客户机应用程序使用 API 读取/写入 MQMD 字段。 它也允许访问 MQ 消息数据。 缺省情况下,已禁用对 MQMD 的访问,必须由应用程序使用 Destination 属性 XMSC_WMQ_MQMD_WRITE_ENABLED 和 XMSC_WMQ_MQMD_READ_ENABLED 来明确进行启用。 这两个属性相互独立。

除 StrucId 和 Version 以外的所有其他 MQMD 字段都作为额外的 Message 对象属性公开,并添加了前缀 JMS_IBM_MQMD。

JMS_IBM_MQMD* 属性的优先级高于其他属性(如上表中所述的 JMS_IBM*)。

发送消息

表示除 StrucId 和 Version 之外的所有 MQMD 字段。 这些属性仅仅是指 MQMD 字段;属性同时出现在 MQMD 和 MQRFH2 头中,不会设置或抽取 MQRFH2 中的版本。 除了 JMS_IBM_MQMD_BackoutCount 之外,以上任意属性都可以设置。 将忽略对 JMS_IBM_MQMD_BackoutCount 设置的任何值。

如果属性具有最大长度限制,而您提供的值过长,则该值会被截断。

对于某些属性,还必须在 Destination 对象上设置 XMSC_WMQ_MQMD_MESSAGE_CONTEXT 属性。 应用程序必须以相应的上下文权限运行才能使属性生效。 如果未将 XMSC_WMQ_MQMD_MESSAGE_CONTEXT 设置为相应的值,那么将忽略此属性值。 如果将 XMSC_WMQ_MQMD_MESSAGE_CONTEXT 设置为相应的值,但您对于队列管理器没有足够的上下文权限,那么将发出异常。 下面是一些要求 XMSC_WMQ_MQMD_MESSAGE_CONTEXT 具有特定值的属性。

以下属性要求将 XMSC_WMQ_MQMD_MESSAGE_CONTEXT 设置为 XMSC_WMQ_MDCTX_SET_IDENTITY_CONTEXT 或 XMSC_WMQ_MDCTX_SET_ALL_CONTEXT:
  • JMS_IBM_MQMD_UserIdentifier
  • JMS_IBM_MQMD_AccountingToken
  • JMS_IBM_MQMD_ApplIdentityData
以下属性要求将 XMSC_WMQ_MQMD_MESSAGE_CONTEXT 设置为 XMSC_WMQ_MDCTX_SET_ALL_CONTEXT:
  • JMS_IBM_MQMD_PutApplType
  • JMS_IBM_MQMD_PutApplName
  • JMS_IBM_MQMD_PutDate
  • JMS_IBM_MQMD_PutTime
  • JMS_IBM_MQMD_ApplOriginData

接收消息

如果将 XMSC_WMQ_MQMD_READ_ENABLED 属性设置为 true,那么所有这些属性在收到的消息上均可用,而与生产应用程序设置的实际属性无关。 应用程序无法修改所收到消息的属性,除非首先根据 JMS 规范清除了所有属性。 可以在不修改属性的情况下转发已接收的消息。
注: 如果应用程序从 XMSC_WMQ_MQMD_READ_ENABLED 属性设置为 true 的目标接收消息,并将其转发到 XMSC_WMQ_MQMD_WRITE_ENABLED 设置为 true 的目标,那么这会导致将所接收消息的所有 MQMD 字段值复制到转发的消息中。 属性表
表 2. 表示 MQMD 字段的 Message 对象属性
属性 描述 类型
JMS_IBM_MQMD_REPORT 报告消息的选项 System.Int32
JMS_IBM_MQMD_MSGTYPE 消息类型 System.Int32
JMS_IBM_MQMD_EXPIRY 消息生命周期 System.Int32
JMS_IBM_MQMD_FEEDBACK 反馈或原因码 System.Int32
JMS_IBM_MQMD_ENCODING 消息数据的数字编码 System.Int32
JMS_IBM_MQMD_CODEDCHARSETID 消息数据的字符集标识 System.Int32
JMS_IBM_MQMD_FORMAT 消息数据的格式名称 System.String
JMS_IBM_MQMD_PRIORITY
注: 如果为 JMS_IBM_MQMD_PRIORITY 指定的值不在 0-9 范围内,那么此值将违反 JMS 规范。
消息优先级 System.Int32
JMS_IBM_MQMD_PERSISTENCE 消息持久性 System.Int32
JMS_IBM_MQMD_MSGID
注: JMS 规范声明消息标识必须由 JMS 提供程序设置,并且必须唯一或为空。 如果为 JMS_IBM_MQMD_MSGID 指定了值,那么此值将复制到 JMSMessageID。 因此,此值不是由 JMS 提供程序设置,并且可能不唯一:此值违反了 JMS 规范。
消息标识 字节数组
注: 在消息上使用字节数组属性违反 JMS 规范。
JMS_IBM_MQMD_CORRELID
注: 如果对 JMS_IBM_MQMD_CORRELID 指定以字符串 "ID:" 开头的值,那么此值将违反 JMS 规范。
相关标识 字节数组
注: 在消息上使用字节数组属性违反 JMS 规范。
JMS_IBM_MQMD_BACKOUTCOUNT 回退计数器 System.Int32
JMS_IBM_MQMD_REPLYTOQ 应答队列的名称 System.String
JMS_IBM_MQMD_REPLYTOQMGR 应答队列管理器的名称 System.String
JMS_IBM_MQMD_USERIDENTIFIER 用户标识 System.String
JMS_IBM_MQMD_ACCOUNTINGTOKEN 记帐标记 字节数组
注: 在消息上使用字节数组属性违反 JMS 规范。
JMS_IBM_MQMD_APPLIDENTITYDATA 与身份有关的应用程序数据 System.String
JMS_IBM_MQMD_PUTAPPLTYPE 放置消息的应用程序的类型 System.Int32
JMS_IBM_MQMD_PUTAPPLNAME 放置消息的应用程序的名称 System.String
JMS_IBM_MQMD_PUTDATE 消息的放置日期 System.String
JMS_IBM_MQMD_PUTTIME 消息放置的时间 System.String
JMS_IBM_MQMD_APPLORIGINDATA 与源有关的应用程序数据 System.String
JMS_IBM_MQMD_GROUPID 组标识 字节数组
注: 在消息上使用字节数组属性违反 JMS 规范。
JMS_IBM_MQMD_MSGSEQNUMBER 组内本地消息的序号 System.Int32
JMS_IBM_MQMD_OFFSET 从逻辑消息开始的物理消息数据偏移量 System.Int32
JMS_IBM_MQMD_MSGFLAGS 消息标志 System.Int32
JMS_IBM_MQMD_ORIGINALLENGTH 原始消息的长度 System.Int32

请参阅 MQMD 以获取更多详细信息。

示例

以下示例生成的消息将放入 MQMD.UserIdentifier 设置为“JoeBloggs”的队列或主题中。

  // Create a ConnectionFactory, connection, session, producer, message
  // ...

  // Create a destination
  // ...

  // Enable MQMD write
  dest.setBooleanProperty(XMSC_WMQ_MQMD_WRITE_ENABLED, 
		XMSC_WMQ_MQMD_WRITE_ENABLED_YES);
  
  // Optionally, set a message context if applicable for this MD field
  dest.setIntProperty(XMSC_WMQ_MQMD_MESSAGE_CONTEXT, 
    XMSC_WMQ_MDCTX_SET_IDENTITY_CONTEXT);

  // On the message, set property to provide custom UserId
  msg.setStringProperty(JMS_IBM_MQMD_USERIDENTIFIER, "JoeBloggs");

  // Send the message
  // ...

在设置 JMS_IBM_MQMD_USERIDENTIFIER 之前,需要先设置 XMSC_WMQ_MQMD_MESSAGE_CONTEXT。 有关使用 XMSC_WMQ_MQMD_MESSAGE_CONTEXT 的更多信息,请参阅 Message 对象属性。

同样,可通过在收到消息前将 XMSC_WMQ_MQMD_READ_ENABLED 设置为 true,然后使用消息获取方法(如 getStringProperty)来抽取 MQMD 字段内容。 收到的任何属性均为只读。

此示例将从队列或主题中获取用于保存消息 MQMD.ApplIdentityData 字段值的值字段。

  // Create a ConnectionFactory, connection, session, consumer
  // ...

  // Create a destination
  // ...

  // Enable MQMD read
  dest.setBooleanProperty(XMSC_WMQ_MQMD_READ_ENABLED, XMSC_WMQ_MQMD_READ_ENABLED_YES);

  // Receive a message
  // ...

  // Get required MQMD field value using a property
  System.String value = rcvMsg.getStringProperty(JMS_IBM_MQMD_APPLIDENTITYDATA);