Поместите свойства сообщения JMS в очередь IBM MQ и получите доступ к ним из другого клиента JMS, работающего на платформе Websphere Freedom

У меня есть два приложения JMS, которые используют сервер IBM MQ в качестве отдельного сервера MQ. Я хочу установить свойство сообщения от одного клиента и поместить сообщение в очередь IBM. Другое стороннее клиентское приложение, работающее на платформе WebSphere Freedom, использует «messageSelector» для фильтрации и чтения сообщений с сервера IBM MQ в соответствии со свойством сообщения.

Код производителя

    public void send(AppMessage msg) throws JMSException {
        MessageProducer messageProducer = this.messageProducer;
        TextMessage sendMsg = session.createTextMessage();
        if (groupingEnabled) {

            sendMsg.setStringProperty(SettingsConstants.JMS_GRP_ID_PROPERTY, msg.getMsgGroupId());
        }
        // Property set in here
        sendMsg.setStringProperty("appServerID","12");
        String message = msg.composeMessage();
        sendMsg.setText(message);
        messageProducer.send(sendMsg);
    }

Когда я оцениваю сообщение со стороны сервера IBM MQ, свойство сообщения «appServerID» не было видно, и messageSelector не мог фильтровать сообщение. Но «JMSXGroupID», установленный sendMsg.setStringProperty(SettingsConstants.JMS_GRP_ID_PROPERTY, msg.getMsgGroupId());, был виден, и messageSelector работал.

Вот как messageSelector реализован со стороны потребителя

@MessageDriven(activationConfig = {
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "FromPreProcessedQueue"),
        @ActivationConfigProperty(propertyName = "messageSelector", propertyValue = "appServerID = 12")
})
public class ConnectorPreProcessedBean implements MessageListener {

Я попытался добавить префикс «usr» к имени свойства сообщения, как в тексте . Я получил сообщение об ошибке, указывающее, что JMS не поддерживает этот формат. Ошибка: «Имя свойства «usr.appServerID» не является допустимым идентификатором Java (tm)».

sendMsg.setStringProperty("usr.appServerID","12");

Затем я попытался добавить поле заголовка ниже, и это не сработало.

MQRFH2 header = new MQRFH2();
header.setFieldValue("appServerID", "12");
sendMsg.setObjectProperty("JMS_IBM_MQRFH2", header);

Сообщение просмотрено со стороны IBM MQ

[bin]$ ./amqsbcg FromPreProcessedQueue QM1 1

AMQSBCG0 - starts here
**********************

 MQOPEN - 'FromPreProcessedQueue'


 MQGET of message number 1, CompCode:0 Reason:0
****Message descriptor****

  StrucId  : 'MD  '  Version : 2
  Report   : 0  MsgType : 8
  Expiry   : -1  Feedback : 0
  Encoding : 273  CodedCharSetId : 1208
  Format : 'MQSTR   '
  Priority : 4  Persistence : 1
  MsgId : X'414D5120514D31202020202020202020C49A036602850140'
  CorrelId : X'000000000000000000000000000000000000000000000000'
  BackoutCount : 0
  ReplyToQ       : '                                                '
  ReplyToQMgr    : 'QM1                                             '
  ** Identity Context
  UserIdentifier : 'mqm         '
  AccountingToken :
   X'0000000000000000000000000000000000000000000000000000000000000000'
  ApplIdentityData : '                                '
  ** Origin Context
  PutApplType    : '28'
  PutApplName    : 'WebSphere MQ Client for Java'
  PutDate  : '20240327'    PutTime  : '06213953'
  ApplOriginData : '    '

  GroupId : X'300000000000000000000000000000000000000000000000'
  MsgSeqNumber   : '1'
  Offset         : '0'
  MsgFlags       : '8'
  OriginalLength : '-1'

****Message properties****

  None

****   Message      ****

 length - 33 of 33 bytes

00000000:  1C1C 3232 3432 301C 4446 4958 2049 4E46           '..22420. INF'
00000010:  4F52 4D41 5449 4F4E 2052 4551 5545 5354           'ORMATION REQUEST'
00000020:  1C       

Версия IBM-MQ: 9.4.3 Версия JMS: javax.jms из Maven: j2ee:j2ee:1.4 (j2ee-1.4.jar)

Может ли кто-нибудь помочь решить эту проблему, установив собственные свойства сообщения. Обратите внимание, что это отлично работает с существующими свойствами в JMS.

Похоже, вы установили его правильно, поэтому можете ли вы рассказать нам, что заставило вас поверить в его отсутствие? Можете ли вы отредактировать свой вопрос, чтобы отобразить селектор сообщений? Просматривали ли вы сообщение после его размещения с образцом, предоставленным MQ, например amqsbcg, который можно использовать для форматирования свойств сообщения.

Morag Hughson 27.03.2024 08:25

Я добавил ответ amqsbcg с реализацией messageSelector. Моей главной заботой была полная работа с существующими свойствами сообщений, и когда я реализовал пользовательское свойство, оно не сработало. В проводнике MQ я просматриваю сообщения, и даже если я включил «Именованные свойства», они не отображаются.

Kavishka Rathnaweera 27.03.2024 09:35
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
199
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для вывода amqsbcg в примере есть третий параметр, который управляет обработкой свойств сообщения. Без указания опции значением по умолчанию является 0, то есть PROPS_AS_Q_DEF. Поскольку ваш вывод не содержит ни раздела свойств, ни заголовка RFH2, я подозреваю, что это означает, что ваша очередь определена с помощью PROPCTL(NONE). Это означает, что сообщение возвращается в amqsbcg без каких-либо свойств.

Попробуйте запустить amqsbcg с 1 в качестве третьего параметра и посмотрите, распечатаются ли свойства.

(Я знаю, что это не ответ на исходный вопрос и должен быть комментарием, но у меня недостаточно репутации, чтобы комментировать, извините).

Спасибо за ответ. Я выполнил amqsbcg со значением 1, и теперь в разделе «Свойства сообщения» появилось значение «Нет». Я обновил ответ в вопросе. Кажется, свойства настраиваемых сообщений отключены или что-то в этом роде в IBM MQ.

Kavishka Rathnaweera 27.03.2024 11:34

Я ожидаю увидеть в этом разделе несколько встроенных свойств. Пример из моей системы: ****Message properties**** mcd.Msd : 'jms_text' jms.Dst : 'queue:///DOUG.BASIC' jms.Tms : '1711540135623' jms.Dlv : '2' SelectMe : TRUE Наиболее вероятной причиной отсутствия всех свойств является атрибут targetClient в пункте назначения JMS. Можете ли вы предоставить конфигурацию администрируемого места назначения, используемого приложением JMS для размещения?

Doug Burns 27.03.2024 12:59

Проверьте конфигурацию назначения jms. Если у вас установлен targetClient = "MQ", вы не получите заголовок RFH2, а свойства JMS находятся в заголовке RFH2.

Alasdair 27.03.2024 13:06

Большое спасибо. Это было решено, когда я установил targetClient как «JMSC.MQJMS_CLIENT_JMS_COMPLIANT». Теперь свойства клиента можно увидеть.

Kavishka Rathnaweera 28.03.2024 09:45

Другие вопросы по теме