为什么当我通过基于Java的客户端程序放置消息时,我的WebSphere MQ(在Windows上)API Exit没有记录任何内容?

时间:2010-08-11 09:37:46

标签: ibm-mq

我在Windows上为WebSphere MQ 7编写了一个API EXIT,当我从命令行输入或从队列中获取一条简单的消息,如:“ 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资源管理器,我在“消息浏览器”中看到了两条消息: 的
你好,世界!
%Hello,World!

我完全迷失在这里,这个“%”来自哪里?由于编码,我的api出口没有记录put动作?

任何建议将不胜感激! 谢谢!

2 个答案:

答案 0 :(得分:1)

我非常肯定我记得在writeUTF()输出长度信息以及字符串的地方阅读。


啊,是的,这是:

来自WriteUTF()上的IBM自己的doco

  

此方法接受一个ActiveX字符串,并以UTF格式将其写入当前位置的消息数据缓冲区。写入的数据由2字节长度后跟字符数据组成。如果方法成功,DataOffset将增加字符串的长度。

(我的斜体)。正如您已经发现的那样,WriteString()无法长度的方式。

答案 1 :(得分:0)

安装API出口时,必须停止并重新启动队列管理器才能加载出口。你有没有机会在执行第一个和第二个程序之间回收QMgr?

此外,除非出口显式刷新输出缓冲区,否则您可能无法立即看到输出。这是您所看到的行为的另一种可能的解释。

最后,您使用的是什么版本的WMQ? (做一个dspmq来查找。)这是一个APAR IC60172: 64-BIT WINDOWS APPLICATION DOES NOT FIND API EXIT IN EXITS64,它在7.0.1.0中得到修复,可以解释32位程序和64位程序在退出方面表现不同的区别

至于输出的差异,pax提供了一个链接。输出将包含Java和ActiveX中的长度字节,因此doco同样适用于您的情况。