Очередь сообщений IBM с использованием PYMQI и идентификатора корреляции - PullRequest
0 голосов
/ 29 мая 2020

Недавно я унаследовал среду тестирования, использующую PYMQI для помещения сообщения в IBM Websphere Queue. Я исправил большую часть кода, который мне нужен, перейдя по этой ссылке

https://dsuch.github.io/pymqi/examples.html#how -to-correlate-request-and-response-messages-using-correlationid

Единственная нерешенная проблема - это формат идентификатора корреляции. Я пробовал довольно много вариантов, но MQ преобразует идентификатор корреляции в байтовый массив (кажется, это настройка по умолчанию для IBM MQ), прежде чем бросать его на Q. Все мои последующие системы ищут значение HEX и ломаются.

Я застрял на этом уже несколько дней. Есть ли способ принудительно указать идентификатор корреляции в свойствах сообщения?

Пожалуйста, дайте мне знать

С уважением, Аравинд

@ JoshM c большое спасибо за ответ. Это проприетарный код, поэтому его несложно вставить целиком, но вот соответствующий фрагмент. Нисходящая система смотрит на этот идентификатор корреляции JMS, чтобы увеличить его и вернуть в очередь. Когда я отправляю это через приведенный ниже код, он попадает в очередь, преобразуется в массив байтов, однако проверка чтения нижестоящей системы не выполняется. Я хочу, чтобы это попадало в очередь как шестнадцатеричное значение, так как в нем должно быть точное значение, которое я передаю, а не массив байтов.

queue = self._open_write_queue(queue_name)

put_mqmd = pymqi.md()
put_mqmd.Format = CMQC.MQFMT_STRING
CCSID = 1202

 put_opts = pymqi.pmo()
# Set the MsgType to request.
# put_mqmd["MsgType"] = CMQC.MQMT_REQUEST
put_mqmd["MsgId"] = '00002Y0001T1'
put_mqmd["CorrelId"] = '00002Y0001T1'

 put_opts = pymqi.PMO(Options=CMQC.MQPMO_NO_SYNCPOINT +
                                         CMQC.MQPMO_FAIL_IF_QUIESCING + CMQC.MQRO_PASS_CORREL_ID)
            queue.put(message, put_mqmd, put_opts)

когда я помещаю сообщение в очередь, оно успешно отправляется , но не обрабатывается нижестоящей системой:

In the screenshot below the first message in the queue was posted using app JMSToolBox- which has the correlation as expected by the downstream system. The second message was posted using pymqi - which has the correlation-id displayed ID:'hex format'. Also there is JMSDestination displayed as null.

На скриншоте выше первое сообщение в очереди было отправлено с помощью приложения JMSToolBox, которое имеет correlationId, как ожидается нижестоящими системами. Второе сообщение было отправлено с использованием структуры робота / pymqi, у которого отображается идентификатор корреляции: 30303 ..... Также обратите внимание, что JMSDestination отображается как null для второго сообщения (для первого сообщения, отправленного вручную, как 'JMSDestination: queue: /// QueueName'

Теперь у меня две проблемы: CorrelationId не подходит, как я ожидал, и JMSDestination: null. Я не уверен, как я могу установить пункт назначения с помощью библиотеки pymqi (или это установлено на уровне Q-Manager). Любая помощь приветствуется.

Снимок экрана сообщения, отправленного JMSToolBox: enter image description here

Снимок экрана сообщения, отправленного с использованием robotframework-pymqi: enter image description here

Единственное различие, которое я сейчас обнаружил в двух сообщениях, - это JMSDestination: Null в JMSHeader для сообщения, отправленного с помощью Pymqi. Я также попытался изменить PROPCTL настройка очереди - но не помогло.

Могу ли я отправить свойства java с помощью pymqi?

1 Ответ

1 голос
/ 29 мая 2020

Как указано в комментариях, идентификатор корреляции должен быть массивом байтов, дополненным до 24 байтов или 48 шестнадцатеричных чисел. Итак,

Python 2 и 3 совместимый способ

put_mqmd["CorrelId"] = 'Aravind'.ljust(24).encode('utf-8')

Python 3 единственный способ

put_mqmd["CorrelId"] = bytes('Aravind'.ljust(24), 'utf-8')

, но самый простой способ - позволить базовому клиенту генерировать это для вас, передавая CMQC.MQPMO_NEW_CORREL_ID. Я не могу сказать вам, где в вашем коде, потому что вы не показали этот бит, но в документации pymqi есть образцы.

...