2011-04-28 45 views
0

我遇到了Data Queue对象的问题。我通过Java中的Data Queue对象将消息发送到iSeries程序(又名AS400)。我可以写入iSeries并读取响应,但问题是数据队列的大小由我之前发送的消息的大小来定义,因此,当我收到答案时,它已被截断为大小请求消息和我松散的信息。我该如何解决这个问题?谁能帮我?我正在使用JTOpen库。数据队列大小限制 - 从iSeries到Java的通信

感谢

+0

如何创建数据队列?当我从命令提示符创建数据队列时(使用'CRTDTAQ'命令),我必须指定从1到64512字节的最大条目长度。据推测,如果我创建了一个长度为100的数据队列并试图放入200个字节,它会被截断。 – dmc 2011-04-28 17:53:15

+1

您也可能在DataQueue对象上使用'create'方法。根据[我找到的JTOpen Javadocs的这个副本](http://javadoc.midrange.com/jtopen/com/ibm/as400/access/DataQueue.html),这就是你要指定'maxEntryLength'的地方,if你是从Java创建的。 – dmc 2011-04-28 18:06:44

回答

3

不管它如何被创建,数据队列具有“最大条目长度”。如果使用JTOpen设置DataQueue对象,则在CL的CRTDTAQ命令或create方法调用中指定。

如果您打算通过数据队列发送不同长度的消息,则需要创建一个“最大条目长度”大于或等于实际最大条目长度的数据队列。否则,你冒险将一些东西放在一端,并在它从另一端出现时被截断。

Here's the Javadoc它显示了如何从数据队列从JTOpen。

+0

正在创建DataQueue,长度为40000,我们在Java中收到的消息不超过1000个字符,所以它应该正常工作。无论如何,当我们向iSeries发送一个500字符的消息时,响应消息被截断为长度为500.我们的解决方案是用空格填充我们发送的消息,以便它与响应具有相同的长度。虽然,这不会解决问题,但这是我们所说的“锤子解决方案”... – 2011-04-29 10:15:50

+0

我明白了。您确定在iSeries上运行的程序不会截断数据吗?如果您有办法查看数据队列(例如'DBU'或者您甚至可以使用'DMPOBJ'命令,尽管这不是最友好的方式),但您可能需要确认整个响应是否正在完成到数据队列。您必须从Java程序发送消息并抑制逻辑消耗响应来完成此操作。祝你好运! – dmc 2011-04-29 13:28:05

1

你愿意考虑替代解决方案吗?我们在类似情况下使用的方法是通过用户空间(AS/400上的对象类型为USRSPC)传递请求/响应消息的内容,这些空间没有大小限制。那么,如果我没有记错的话,它的大小约为16GB ......用户空间的固定大小名称反过来又通过AS/400服务器和Java客户端之间的数据队列(DTAQ)传递。

+1

有趣的想法。根据[IBM](http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/topic/rzamp/rzamp.pdf),虽然最大用户空间大小约为16 MB。这仍然比64 kB的最大数据队列条目大得多。 – dmc 2011-05-14 17:17:05

+0

感谢您的更正,@dmc!它有一段时间了,所以细节有点褪色,对不起。我只记得它比DTAARA,USRQ或DTAQ好得多。再次感谢。 – mazaneicha 2011-05-17 01:59:13

+0

用户空间存在安全问题(因此需要* SEC QALWUSRDMN系统值)。为什么不将文件(“消息”)转储到共享目录并使用数据队列发送路径/名称?没有关于那里的大小。 – user2338816 2014-04-04 13:02:54