2016-06-13 7 views
0

私の割り当て:私はIBM MQシリーズが提供するキューシステムを持っています。私は "デッドレターキュー"のすべてのメッセージを取得する必要があります。 RFH2-Headerと元のペイロードはDead-Letterで組み立てられました。私は元のペイロードはほとんどがzipファイルまたは文字列です。ペイロードがzipファイルである可能性があるので、私はペイロードをjavaのbyte []として保存する必要があります。 RFH2はLinked 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); 
    } 
} 

を今では何が起こる: 私はデータから抜け出すに新しいメッセージを作成した場合、それは第二千六十六charでRFH2をカットし、私がこれまで持っているもの

。元のペイロードを呼び出すと、NullPointerが取得されます。

クエストとは何ですか? RFH2と元のペイロードは両方とも「Dead-Letter-Payload」に組み込まれています(私があなたに伝えようとしていることを理解できないことを願っています)。私がこれまでに試したのは、</usr>のタグをペイロードで検索し、2つの部分を保存することです。最初の部分をStringとして保存し、2番目の部分をbyte []として保存しました。これがうまくいくかどうかは私には全くのアイデアはありません。

私の質問: それは[]二つの部分にデッド・レター・ペイロードを分割し、バイトとして文字列として最初の1、2つ目を保存することは可能ですか?

+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

ありがとう、私はこれらの3つのエラーを取得します: MQJE001:Beendigungscode '1'、Ursache '2142'。 MQJE001:Beendigungscode '2'、Ursache '2195'。 MQJE001:Beendigungscode '2'、Ursache '2195'。 私は彼らを見つけましたが、私の場合は正しいとは思われません。 私はMQRFH2のインスタンスを作成しますが、決して使用しないことは特別です。 –

関連する問題