2011-04-28 49 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