Ошибка записи сообщения ActiveX IBM MQSeries - PullRequest
3 голосов
/ 11 мая 2011

У меня есть приложение VB6 с классами автоматизации MQSeries для ActiveX.Проблема в том, когда я пишу сообщение в очередь.Я использую этот код:

Вот как я открываю соединение и относительную очередь:

Set MQSess = New MQSession
//Access Queue
Set QMgr = MQSess.AccessQueueManager(QueueManagerName)

Dim Queue As MQQueue
Dim msg As MQMessage
Dim pmo As MQPutMessageOptions

Dim ArrCar() As Byte

Set pmo = New MQPutMessageOptions

Set Queue = QMgr.AccessQueue(QueueName, OpenOption , RemoteQueueManagerName)
//OpenOption is a integer with value of 16 (MQOO_OUTPUT) 

strMsgAppo = Translate("*MESSAGE_TO_INSERT*", ASCII_To_EBCDIC_Table())

ReDim ArrCar(Len(strMsgAppo) - 1)
For lngI = 1 To Len(strMsgAppo)
    ArrCar(lngI - 1) = Asc(Mid(strMsgAppo, lngI, 1))
Next lngI

Call msg.Write(ArrCar) //Write the ByteArray

Call Queue.Put(msg, pmo)

ASCII_To_EBCDIC_Table - это функция, используемая для изменения кодировки.

ошибка, которую я получаю из MQ:

MQAX200.MQMessage :: Write CompletionCode = 2, ReasonCode = 2043, ReasonName = MQRC_OBJECT_TYPE_ERROR


Кто-нибудь используетэтот activex и может помочь мне, как написать сообщение в очереди?

Ответы [ 2 ]

2 голосов
/ 11 мая 2011

В предоставленном фрагменте кода я не вижу, где установлено соединение с QMgr и где открыта очередь.Оба эти шага должны быть выполнены, прежде чем можно будет помещать сообщения в очередь.

Код причины 2043 возникает, когда в поле «Параметры сообщения» есть недопустимая опция для PUT или OPEN,В этом случае проблема может быть либо в PUT, либо в неявном OPEN, в зависимости от того, что содержится в коде, который не был предоставлен, и содержит ли он OPEN.

. Мое предложение будет относиться к.Net образцы, представленные в установке и согласовать между ними и вашим приложением.Образцы находятся в C:\Program Files (x86)\IBM\WebSphere MQ\tools\dotnet\samples в установке V7 по умолчанию.

1 голос
/ 11 мая 2011

Ошибка в вашем сообщении msg.Write, и вам, вероятно, следует вместо этого использовать метод .WrirteString после установки для свойства .CharacterSet значения 37 (EBCDIC).

Хакерский подход вашего Translate ()Функция может работать, но только если она назначена байтовому массиву.Поскольку у вас есть вещи, которые вы, вероятно, увидите, скремблирование, когда данные преобразуются обратно в Unicode.Или, если Translate () возвращает массив байтов, вы получите беспорядок с 8-битными данными в строке Unicode (что может быть хорошо, но не с этой библиотекой MQ).

Возможно, вы просто выбросите Translate() и вашей таблицы.

Руководство IBM по этому API называется " Использование объектной модели компонентов Interfac e."Проверьте это!

...