Как использовать свойства JMS в интерфейсе IBM MQ JMS? - PullRequest
5 голосов
/ 01 мая 2011

Я использую интерфейс MQ JMS с MQ 6.0.2.

Кажется, что поддерживаются только предопределенные свойства, а не произвольные. например, я могу правильно getJMSCorrelationID(), getJMSPriority() и т. д. Однако, когда я устанавливаю произвольное свойство для отправителя:

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

Я не могу получить собственность из сообщения на приемнике:

message.getStringProperty("my arbitrary name");

Я просто получаю null.

Есть ли способ сделать это, как в любой реализации JMS, или это ограничение MQ JMS?

Ответы [ 2 ]

4 голосов
/ 02 мая 2011

Если у вас установлена ​​полная клиентская установка, вы можете перейти к C:\Program Files\IBM\WebSphere MQ\tools\jms\samples\interactive\ или где-нибудь в /opt/mqm/samp и найти SampleConsumerJava.java и SampleProducerJava.java.

Из примера программы Producer:

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

И из образца Consumer:

  // 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 и не могут содержать пробелы.

2 голосов
/ 01 мая 2011

Согласно спецификации JMS 1.1 :

Идентификатор неограниченной длины последовательность символов, которая должна начинаться с запуском идентификатора Java персонаж; все последующие персонажи должна быть частью идентификатора Java персонажи. Идентификатор начала персонаж - это любой персонаж, для которого метод Character.isJavaIdentifierStart возвращает истину. Это включает ‘_’ и «$». Идентификатор части символа любой символ, для которого метод Character.isJavaIdentifierPart возвращает правда.

Следуя подсказкам, мы переходим к Javadoc для метода Character.isJavaIdentifierPart , в котором перечислены допустимые символы для идентификатора:

Символ может быть частью 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

Обратите внимание, что пробел специально исключен из набора допустимых символов идентификатора. Набор допустимых первых символов немного более строг и включает следующие символы:

* 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 значительно улучшена , как показано в примере IBM .

...