С# Клиент IBM MQ, отправляющий мой собственный messageId

Я отправляю сообщение MQ и получаю в ответ идентификатор сообщения и идентификатор корреляции, как и ожидалось, и я могу получить ответ от определенного сообщения, которое я отправляю, используя идентификатор сообщения, возвращенный сервером MQ.

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

Я не владелец диспетчера очередей, и администратор ответил: «Создал свой собственный идентификатор сообщения».

Я могу это сделать? Должен ли идентификатор сообщения иметь определенный формат?

Это мой код:

            message = strInputMsg;
            queueMessage = new MQMessage();
            queueMessage.WriteString(message);
            queueMessage.Format = MQC.MQFMT_STRING;
            queueMessage.Expiry = timeOutExpiry;
            queueMessage.ReplyToQueueName = QueueNameExpiry;
            queuePutMessageOptions = new MQPutMessageOptions();
            queuePutMessageOptions.Options =       MQC.MQRO_COPY_MSG_ID_TO_CORREL_ID;
            queue.Put(queueMessage, queuePutMessageOptions);
            bytReturn = queueMessage.MessageId;

Итак, могу ли я установить для свойства MessageID значение моего собственного идентификатора сообщения перед отправкой сообщения, как показано ниже?

queueMessage.MessageId = myOwnMessageId

person Ivan Fontalvo    schedule 01.11.2016    source источник
comment
Я бы рекомендовал не генерировать собственный идентификатор сообщения. Лучше всего копировать идентификатор сообщения запроса в идентификатор корреляции ответа.   -  person Stavr00    schedule 04.11.2016


Ответы (1)


Да, возможно, что код явно задает идентификатор сообщения, но ваш код, по-видимому, не использует структуру MQMD повторно, как это обычно и происходит. Скорее всего, исходя из вашего описания и кода, инструмент нагрузочного тестирования воспроизводит одни и те же сообщения несколько раз и при этом сохраняет идентификатор сообщения.

Если MQ разрешено устанавливать идентификатор сообщения, он гарантирует, что он будет уникальным в диспетчере очередей для идентификаторов, которые он генерирует. Он не гарантирует GUID для многих администраторов очередей, но пытается предотвратить конфликты, включая 12 символов имени QMgr в идентификатор сообщения. Таким образом, хотя у нас нет информации о том, какой инструмент нагрузочного тестирования используется и использует ли он повторное воспроизведение сообщений, эта возможность кажется гораздо более вероятной, чем то, что в MQ есть ошибка, которая дублирует идентификаторы сообщений во время выполнения конструктора класса .Net MQMessage().

См.:
класс MQMessage.NET, который говорит: "Создает объект MQMessage с информацией о дескрипторе сообщения по умолчанию..." Конечно, MQMD по умолчанию заставляет QMgr генерировать идентификатор сообщения.

MQMD — MsgId (MQBYTE24), который объясняет в примечании внизу, как MsgID делается уникальным, и в теле, как им может управлять приложение, размещающее сообщения.

person T.Rob    schedule 02.11.2016