【问题标题】:How to use JMS Properties on IBM MQ JMS Interface?如何在 IBM MQ JMS 接口上使用 JMS 属性?
【发布时间】:2011-08-16 09:02:53
【问题描述】:

我正在使用 MQ JMS 接口和 MQ 6.0.2。

似乎只支持预定义的属性,而不是任意的。 例如,我可以正确地getJMSCorrelationID()getJMSPriority() 等。但是,当我在发件人上设置任意属性时:

message.setStringProperty("my arbitrary name", "value");

我无法从接收方的消息中获取属性:

message.getStringProperty("my arbitrary name");

我只是得到null

有没有办法像在任何 JMS 实现中那样做到这一点,还是 MQ JMS 限制?

【问题讨论】:

  • 顺便说一下,您的最后一个问题是关于 WebSphere MQ,但这里的标题是“MS JMS”。您使用的是 MSMQ 还是 WMQ?如果它是 WebSphere MQ,请确保使用标签 websphere-mq 来代替更通用的标签 mq,或者除了使用更通用的标签 mq 之外,这样可以更快地找到它。这里所有的 mq 标签都相当少,所以您越具体,就越有可能找到您的问题。我正要重新标记,突然想到这实际上可能是一个 MSMQ 问题。

标签: properties jms ibm-mq


【解决方案1】:

根据JMS 1.1 specification

标识符是无限长的 必须开始的字符序列 以 Java 标识符开头 特点;以下所有字符 必须是 Java 标识符部分 人物。标识符开始 字符是任何字符 方法 Character.isJavaIdentifierStart 返回真。这包括“_”和 ‘$’。标识符部分字符是 该方法适用的任何字符 Character.isJavaIdentifierPart 返回 真的。

按照这里的线索,我们可以看到 Character.isJavaIdentifierPart 方法的 Javadoc,该方法列出了标识符的有效字符:

一个字符可能是 Java 的一部分 标识符,如果以下任何一项是 真的:

* it is a letter
* it is a currency symbol (such as '$')
* it is a connecting punctuation character (such as '_')
* it is a digit
* it is a numeric letter (such as a Roman numeral character)
* it is a combining mark
* it is a non-spacing mark
* isIdentifierIgnorable(codePoint) returns true for the character

请注意,空格被明确排除在有效标识符字符集中。 set of valid first characters 限制性更强,包括以下字符:

* isLetter(ch) returns true
* getType(ch) returns LETTER_NUMBER
* ch is a currency symbol (such as "$")
* ch is a connecting punctuation character (such as "_").

使用有效的标识符并重试。例如:

message.setStringProperty("my.arbitrary.name", "value");
message.getStringProperty("my.arbitrary.name");

或者可能……

message.setStringProperty("myArbitraryName", "value");
message.getStringProperty("myArbitraryName");

顺便说一句,尽早切换到 V7。不仅对属性的支持总体上要好得多,而且直接读/写 MQMD 标头的能力也大大提高了as shown in the IBM example

【讨论】:

  • 对不起,这对我来说不是很清楚 :-( 你是否建议我应该将代码更改为其他内容然后 message.setStringProperty("my任意名称", "value"); ?你能举个例子吗?
  • 基本上,标识符不能嵌入空白。替换一个有效的 char 或像 Java 变量名一样将它们一起运行:myArbitraryProperty
【解决方案2】:

如果你有完整的客户端安装,你可以去C:\Program Files\IBM\WebSphere MQ\tools\jms\samples\interactive\/opt/mqm/samp的某个地方寻找SampleConsumerJava.javaSampleProducerJava.java

来自示例 Producer 程序:

  // Set custom properties
  msg.setStringProperty("MyStringProperty", "My Year Of Birth");
  msg.setIntProperty("MyIntProperty", 2007);

来自示例消费者:

  // Get values for custom properties, if available
  String property1 = msg.getStringProperty("MyStringProperty");

  // Get value for an int property, store the result in long to validate
  // the get operation.
  long property2 = ((long) Integer.MAX_VALUE) + 1;
  property2 = msg.getIntProperty("MyIntProperty");

  if ((property1 != null) && (property2 < Integer.MAX_VALUE)) {
    System.out.println("[Message has my custom properties]");

属性名遵循 Java 变量名的规则,不能有空格。

【讨论】:

  • +1 用于代码示例并提及完整的客户端安装。
猜你喜欢
  • 2023-03-05
  • 2020-09-29
  • 1970-01-01
  • 2019-12-31
  • 2018-04-06
  • 1970-01-01
  • 2021-04-17
  • 2018-02-08
  • 1970-01-01
相关资源
最近更新 更多