我维护一个使用 Apache QPID 作为消息交换中间件的系统。它的客户端大多是用 Java 编写的,使用 JMS 作为 Java 中 QPID 的抽象层。
另一方面,我通常使用一个客户端,也使用相同的技术集用 Java 编写,我用它来收听一些 EXCHANGE/TOPICS 作为监控工具。
一切都运行良好,但我很感兴趣的是,消息元素的顺序对于包含完全相同信息的确切消息会有所不同,而且更重要的是,使用相同的算法生成。
正如您在下面的代码片段中所见,我遍历 JMSMapMessage
属性,将每个元素插入到 HashMap 中,该 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
它被遍历的地方调试了应用程序,我也可以看到顺序上的差异。
这根本不影响系统,但我想知道:
- 如果两个 HashMap 填充了相同的键,其元素以相同的顺序插入,则在其键上生成相同的迭代顺序。正如我上面写的,我倾向于认为他们这样做。
- 如果 QPID 更改其消息元素的顺序以进行某种对齐,从而优化传输。或者 JMS 层可能会改变这个顺序?
编辑
我认为这个问题的第一部分值得提出自己的问题: HashMap 元素的顺序是否可重现?
看起来 HashMaps 不应该改变,但它根本不能保证,它可以在 HashMap 实现改变的第一刻改变。
现在,这个问题应该集中在 QPID 方面。