Как использовать свойства JMS в интерфейсе IBM MQ JMS?

#properties #jms #ibm-mq

#свойства #jms #ibm-mq

Вопрос:

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

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

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

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

 message.getStringProperty("my arbitrary name");
  

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

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

Комментарии:

1. Кстати, ваш последний вопрос был о WebSphere MQ, но название здесь «MS JMS». Используете ли вы MSMQ или WMQ? Если это WebSphere MQ, обязательно используйте тег websphere-mq вместо или в дополнение к более общему тегу mq, чтобы его можно было быстрее найти. Все теги mq здесь имеют довольно небольшой объем, поэтому, чем конкретнее вы будете, тем больше вероятность, что ваш вопрос будет найден. Я собирался переназначить, и мне пришло в голову, что на самом деле это может быть вопрос MSMQ.

Ответ №1:

Если у вас установлена полная версия клиента, вы можете перейти на C:Program FilesIBMWebSphere MQtoolsjmssamplesinteractive или куда-нибудь в /opt/mqm/samp и поискать SampleConsumerJava.java и SampleProducerJava.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) amp;amp; (property2 < Integer.MAX_VALUE)) {
    System.out.println("[Message has my custom properties]");
  

Имена свойств соответствуют правилам для имен переменных Java и не могут содержать пробелов в них.

Комментарии:

1. 1 за примеры кода и упоминание полной установки клиента.

Ответ №2:

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

Идентификатор — это последовательность символов неограниченной длины, которая должна начинаться с начального символа идентификатора Java; все последующие символы должны быть символами части идентификатора Java. Начальный символ идентификатора — это любой символ, для которого используется Символ метода.isJavaIdentifierStart возвращает true. Сюда входят ‘_’ и ‘$’. Символ части идентификатора — это любой символ, для которого используется Символ метода.isJavaIdentifierPart возвращает значение true.

Следуя приведенным здесь подсказкам, мы переходим к Javadoc для Персонажа.Есть ли метод javaidentifierpart, который выводит список допустимых символов для идентификатора:

Символ может быть частью идентификатора 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");

Кстати, переключитесь на версию 7 при первой возможности. Поддержка свойств не только значительно улучшена в целом, но и значительно улучшена возможность прямого чтения / записи заголовков MQMD , как показано в примере IBM.

Комментарии:

1. Извините, мне это непонятно 🙁 вы предлагаете мне изменить код на что-то другое, а затем message.setStringProperty(«мое произвольное имя», «значение»); ? не могли бы вы привести пример?

2. В принципе, идентификаторы не могут содержать встроенных пробелов. Замените допустимый символ или запустите их вместе, как имя переменной Java: myArbitraryProperty .