У меня есть два приложения 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.
Я добавил ответ amqsbcg с реализацией messageSelector. Моей главной заботой была полная работа с существующими свойствами сообщений, и когда я реализовал пользовательское свойство, оно не сработало. В проводнике MQ я просматриваю сообщения, и даже если я включил «Именованные свойства», они не отображаются.
Для вывода amqsbcg в примере есть третий параметр, который управляет обработкой свойств сообщения. Без указания опции значением по умолчанию является 0, то есть PROPS_AS_Q_DEF. Поскольку ваш вывод не содержит ни раздела свойств, ни заголовка RFH2, я подозреваю, что это означает, что ваша очередь определена с помощью PROPCTL(NONE). Это означает, что сообщение возвращается в amqsbcg без каких-либо свойств.
Попробуйте запустить amqsbcg с 1 в качестве третьего параметра и посмотрите, распечатаются ли свойства.
(Я знаю, что это не ответ на исходный вопрос и должен быть комментарием, но у меня недостаточно репутации, чтобы комментировать, извините).
Спасибо за ответ. Я выполнил amqsbcg со значением 1, и теперь в разделе «Свойства сообщения» появилось значение «Нет». Я обновил ответ в вопросе. Кажется, свойства настраиваемых сообщений отключены или что-то в этом роде в IBM MQ.
Я ожидаю увидеть в этом разделе несколько встроенных свойств. Пример из моей системы: ****Message properties**** mcd.Msd : 'jms_text' jms.Dst : 'queue:///DOUG.BASIC' jms.Tms : '1711540135623' jms.Dlv : '2' SelectMe : TRUE
Наиболее вероятной причиной отсутствия всех свойств является атрибут targetClient в пункте назначения JMS. Можете ли вы предоставить конфигурацию администрируемого места назначения, используемого приложением JMS для размещения?
Проверьте конфигурацию назначения jms. Если у вас установлен targetClient = "MQ"
, вы не получите заголовок RFH2, а свойства JMS находятся в заголовке RFH2.
Большое спасибо. Это было решено, когда я установил targetClient как «JMSC.MQJMS_CLIENT_JMS_COMPLIANT». Теперь свойства клиента можно увидеть.
Похоже, вы установили его правильно, поэтому можете ли вы рассказать нам, что заставило вас поверить в его отсутствие? Можете ли вы отредактировать свой вопрос, чтобы отобразить селектор сообщений? Просматривали ли вы сообщение после его размещения с образцом, предоставленным MQ, например amqsbcg, который можно использовать для форматирования свойств сообщения.