Ibm mq 为什么我的WebSphere MQ(在Windows上)API出口没有';当我通过基于Java的客户端程序发送消息时,我不会记录任何东西吗?

Ibm mq 为什么我的WebSphere MQ(在Windows上)API出口没有';当我通过基于Java的客户端程序发送消息时,我不会记录任何东西吗?,ibm-mq,Ibm Mq,我在Windows上为WebSphere MQ 7编写了一个API出口,当我从命令行向队列中放入或从队列中获取一条简单消息时,比如:“amqsput”或“amqsget”,我会得到一些包含时间、消息数据、队列名称等信息的日志文件 这就是我对用Java编写的测试程序的期望,但当我使用下面的代码时: MQMessage msg=new MQMessage()msg.writeUTF(“你好,世界!”)MQPutMessageOptions pmo=新的MQPutMessageOptions()que

我在Windows上为WebSphere MQ 7编写了一个API出口,当我从命令行向队列中放入或从队列中获取一条简单消息时,比如:“amqsput”或“amqsget”,我会得到一些包含时间、消息数据、队列名称等信息的日志文件

这就是我对用Java编写的测试程序的期望,但当我使用下面的代码时:

MQMessage msg=new MQMessage()
msg.writeUTF(“你好,世界!”)
MQPutMessageOptions pmo=新的MQPutMessageOptions()
queue.put(msg,pmo)

我有一个空白的日志文件。然后我使用下面的代码:

MQMessage msg=new MQMessage()
msg.writeString(“你好,世界!”)
MQPutMessageOptions pmo=新的MQPutMessageOptions()
queue.put(msg,pmo)

然后我在日志文件中看到了家族数据

我打开MQ explorer,在“消息浏览器”中看到两条消息:
你好,世界
%你好,世界

我完全迷路了,这个“%”是从哪里来的?由于编码原因,我的api出口没有记录put操作

如有任何建议,将不胜感激!
谢谢大家!

我很确定我记得在某个地方读到过
writeUTF()
输出长度信息和字符串


啊,是的,在这里:

从IBM自己的上
WriteUTF()

此方法获取ActiveX字符串,并将其以UTF格式写入当前位置的消息数据缓冲区。写入的数据由2字节长度和字符数据组成。如果方法成功,DataOffset将按字符串长度递增


(我的斜体)。正如您已经发现的,
WriteString()
是一种无长度的方法。

安装API出口时,必须停止并重新启动队列管理器才能加载出口。您是否在执行第一个和第二个程序之间循环使用QMgr

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

最后,您使用的是什么版本的WMQ?(做一个
dspmq
来找出答案。)这里有一个在7.0.1.0中修复的APAR,它可以解释32位程序和64位程序在出口方面的不同行为


至于产出的差异,帕克斯提供了一个联系。输出将包含Java和ActiveX中的长度字节,因此doco同样适用于您的情况。

谢谢!帕克斯,我知道为什么现在在我的实际消息数据之前有一个“%”。但是为什么put操作没有记录在日志中?我的API出口被设计为记录诸如put、get之类的操作。有什么建议吗?再次谢谢你!不确定,但我会给出一个可能性。如果您的出口是C语言(或另一种使用以null结尾的字符串的语言),并且输出为“%Hello”(其中“.”是nul字节),您可能会得到一个空字符串,因为这就是它的显示方式。“%”将是2字节长度的部分。这是我的猜测,所以可能是完全错误的。我可能会在退出时做一些其他的事情(比如创建/更新文件),就像你做的第一件事一样,这样你就可以看到它是否被调用了。我想你可能是对的。。。我的出口是C。为什么writeUTF存在?该方法在实际消息之前添加额外信息。如果客户端程序使用writeUTF而不是writeString,我应该怎么做?顺便问一下,我在MessageExplorer中只看到了“%Hello”,是因为“.”不可见吗?非常感谢
WriteUTF
之所以存在,是因为它是一种方便地从一端到另一端获取UTF数据的好方法(使用理解格式的
ReadUTF
)。您可能应该根据MQ本身给定的长度在出口中转储数据,而不是假设它是C类型字符串。这样,二进制信息就不会产生问题了。谢谢paxdiablo。您节省了数天的故障排除时间!!谢谢你,罗伯。我没有在这两个程序之间回收QMgr。日志文件是在第一次执行之后创建的,我检查了它,得到了开始和结束,但没有内容(关于put操作的信息)。我的MQ版本是7.0.1.1,我现在刚刚测试了32位API退出函数。包含长度字节(内容未更改)将停止API退出录制?谢谢你的帮助,谢谢!很抱歉耽搁了…现在我们要讨论的是粗糙的位…长度是两个字节,字符串很短,其中一个字节必须是0x00。由于字符串以null结尾,日志文件是否可能没有正确显示?你把原木倒了吗?我在这里考虑的可能性是,数据已写入但未正确显示,或者Java程序的出口行为与示例程序不同。第一个是可以验证的,第二个是32位/64位的问题,这取决于你的JVM。你们太棒了!我十六进制转储日志,是nul字节阻止了我的api退出记录。非常感谢!!!