2016-06-13 30 views
0

我的任務:我有一個IBM MQ系列提供的隊列系統。我需要獲取「死信隊列」的所有消息。 RFH2-Header和原始有效載荷在Dead-Letter中組裝。我原來的有效載荷主要是一個zip文件或字符串。由於有效負載可能是一個zip文件,因此我需要將有效負載保存爲java中的byte []。 RFH2應該是鏈接的HashMap。如何將Java中的MQ系列死信的負載(字節[])中的RFH2(字符串)拆分?

我已經走到這一步:

public ZMessageDTO(final ZMessageType messageType, MQMessage message) throws ZDAEQException { 
     this.mqMessage = message; 
     this.messageType = messageType; 

     List<byte[]> payloadRFH2List = this.split("</usr>".getBytes(StandardCharsets.UTF_8)); 
     rfh2 = getRFH2OfXMLBytes(payloadRFH2List.get(0)); 
     payload = payloadRFH2List.get(1); 
    } 

    public boolean isMatch(byte[] pattern, byte[] input, int pos) { 
     for (int i = 0; i < pattern.length; i++) { 
      if (pattern[i] != input[pos + i]) { 
       return false; 
      } 
     } 
     return true; 
    } 

public List<byte[]> split(byte[] pattern) throws ZDAEQException { 
    try { 
     byte[] input = new byte[(int) mqMessage.getMessageLength()]; 

     for (int i = 0; i < (int) mqMessage.getMessageLength(); i++) { 
      input[i] = mqMessage.readByte(); 
     } 
     List<byte[]> l = new LinkedList<byte[]>(); 
     int blockStart = 0; 
     for (int i = 0; i < input.length; i++) { 
      if (isMatch(pattern, input, i)) { 
       l.add(Arrays.copyOfRange(input, blockStart, i)); 
       blockStart = i + pattern.length; 
       i = blockStart; 
      } 
     } 
     l.add(Arrays.copyOfRange(input, blockStart, input.length)); 
     return l; 
    } catch (IOException e) { 
     throw new ZDAEQException("Couldn't split dead letter" + e); 
    } 
} 

會發生什麼現在: 如果我創建一個新的消息出來的數據的獲取的,它由第二千零六十六字符切RFH2 。如果我打電話給原始有效載荷,我會得到一個NullPointer。

什麼是關鍵? 正如我在作業中提到的那樣,RFH2和原始有效載荷都在「死信有效載荷」中組裝(我希望你能夠擺出我想說的東西)。到目前爲止,我嘗試的是搜索</usr> -ending標籤的有效載荷並保存這兩部分。我將第一部分保存爲字符串,將第二部分保存爲字節[]。如果這有效,我絕對沒有想法。

我的問題: 是否有可能分裂死信有效負載兩個部分,並保存的第一個作爲一個字符串,而第二個作爲一個byte []?

+0

我不是一個Java程序員,但你不能使用MQHeaderIterator或MQHeaderList?請參閱http://www.ibm.com/support/knowledgecenter/SSFKSJ_9.0.0/com.ibm.mq.dev.doc/q030880_.htm - 該頁面有其他各種有用的信息,我懷疑您需要。 –

回答

1

MQRFH2結構非常複雜。如果你不明白,那你爲什麼不使用MQRFH2課?

IBM提供了MQRFH2類,以便開發人員不必處理結構。

mqMsg.seek(0); 
MQRFH2 rfh2 = new MQRFH2(mqMsg); 
byte[] data = new byte[mqMsg.getDataLength()]; 
mqMsg.readFully(data); 
System.out.println("Message data: "+new String(data)); 
+0

謝謝,但我得到這三個錯誤: MQJE001:Beendigungscode'1',Ursache'2142'。 MQJE001:Beendigungscode'2',Ursache'2195'。 MQJE001:Beendigungscode'2',Ursache'2195'。 我搜索了他們,但他們似乎不適合我的情況。 我似乎特別創建了MQRFH2的實例,但從未使用它。 –

相關問題