Почему мой выход API WebSphere MQ (в Windows) ничего не записывал, когда я помещал сообщения через клиентскую программу на основе Java? - PullRequest
3 голосов
/ 11 августа 2010

Я написал API EXIT для WebSphere MQ 7 в Windows, когда помещал в очередь или получал из очереди простое сообщение из командной строки, например: " amqsput " или " amqsget ", Я бы получил некоторые файлы журнала, содержащие информацию, такую ​​как время, данные сообщения, имя очереди и т. Д.

Это то, что я ожидаю от моей тестовой программы, написанной на Java, но когда я использовал код ниже:

MQMessage msg = new MQMessage ();
msg.writeUTF ("Hello, World!");
MQPutMessageOptions pmo = new MQPutMessageOptions ();
queue.put (msg, pmo);

Я получил пустой файл журнала.Затем я использовал следующий код:

MQMessage msg = new MQMessage ();
msg.writeString ("Hello, World!");
MQPutMessageOptions pmo = new MQPutMessageOptions ();
queue.put (msg, pmo);

Затем я увидел фамильные данные в файле журнала.

Я открыл MQ Explorer, я увидел два сообщения в «Обозревателе сообщений»:
Привет, мир!
% Привет, мир!

Я полностью потерян, откуда этот "%"?Мой API-выход не записал положенное действие из-за кодировки?

Буду признателен за любые советы!Спасибо!

Ответы [ 2 ]

1 голос
/ 11 августа 2010

Я почти уверен, что помню, что где-то читал, что writeUTF() выводит информацию о длине, а также строку.


Ах, да, вот оно:

Из собственного IBM doco на WriteUTF():

Этот метод берет строку ActiveX и записывает ее в буфер данных сообщения в текущей позиции в формате UTF. Записанные данные состоят из 2-байтовой длины, за которой следуют символьные данные . DataOffset увеличивается на длину строки, если метод завершается успешно.

(мой курсив). Как вы уже обнаружили, WriteString() - это способ сделать без длины.

0 голосов
/ 11 августа 2010

Когда вы устанавливаете выход API, администратор очередей должен быть остановлен и перезапущен для загрузки выхода.Вы случайно не перезагружали QMgr между выполнением первой и второй программ?

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

Наконец, на какой версии WMQ вы работаете?(Сделайте dspmq, чтобы узнать.) Вот APAR IC60172: 64-битное приложение Windows не находит выход API в EXITS64 , которое было исправлено в 7.0.1.0 и будет учитывать разницу междуБитовые и 64-битные программы ведут себя по-разному в отношении выходов.

Что касается разницы в выводе, pax предоставил ссылку.Выходные данные будут содержать байты длины в Java, а также в ActiveX, так что документация применима в вашем случае одинаково хорошо.

...