メッセージ交換ミドルウェアとして Apache QPID を使用するシステムを維持しています。そのクライアントはほとんどが Java で記述されており、JMS を Java の QPID の抽象化レイヤーとして使用しています。
一方、私は通常、同じテクノロジ セットを使用して Java で記述されたクライアントを使用します。これを使用して、監視ツールとして EXCHANGE/TOPICS をリッスンします。
すべてが完璧に機能していますが、メッセージ要素の順序が、まったく同じ情報を含む正確なメッセージで異なり、さらに同じアルゴリズムを使用して生成されるという事実に興味をそそられます。
以下のコードの断片でわかるように、JMSMapMessage
プロパティを繰り返し処理し、各要素を HashMap に挿入します。これが繰り返されて、スクリーンショットのツリー要素が挿入されます。
Map<String,Object> c = new HashMap<>();
MapMessage mm = (MapMessage)msg;
Enumeration props = mm.getMapNames();
while(props.hasMoreElements())
{
String key = (String)props.nextElement();
Object value = mm.getObject(key); //BREAK POINT to check key value.
c.put(key, value);
}
HashMap は必ずしも順序付けされた項目を保存するとは限りませんが、同じ順序で挿入された等しいキーセットについては、その要素に対して(順序に関して)同等の反復を取得する必要があると考える傾向があります。私は間違っているかもしれません。
とにかく、トラバースされている時点でアプリケーションをデバッグしましたprops
が、順序にも違いがあることがわかります。
これはシステムにはまったく影響しませんが、私は疑問に思います:
- 要素が同じ順序で挿入された同じキーで満たされた 2 つの HashMap が、そのキーに対して同じ反復順序を生成する場合。上で書いたように、私は彼らがそうだと思う傾向があります。
- QPID がそのメッセージ要素の順序を変更して、何らかの整列を行い、送信を最適化する場合。それとも、JMS レイヤーがこの順序を変更する可能性がありますか?
編集
この質問の最初の部分は、独自の質問の価値があると思いました: HashMap 要素の順序は再現可能ですか?
HashMap は変更すべきではないように見えますが、まったく保証されておらず、HashMap の実装が変更された瞬間に変更される可能性があります。
さて、この質問は QPID 側に集中する必要があります。