我维护一个使用Apache QPID作为消息交换中间件的系统。它的客户端大多是用Java编写的,使用JMS作为Java的QPID抽象层。
另一方面,我通常使用一个客户端,也使用相同的技术集用Java编写,我用它来监听一些EXCHANGE / TOPICS作为监控工具。
一切工作都很完美,但我很感兴趣的是,消息元素的顺序因包含完全相同信息的消息而异,更重要的是,使用相同的算法生成。
正如您在下面的代码片段中所看到的,我遍历JMS MapMessage
属性,将每个元素插入到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
遍历它的位置调试了应用程序,我也可以看到顺序上的差异。
这根本不影响系统,但我想知道:
编辑
我认为这个问题的第一部分值得提出自己的问题: Is the order of HashMap elements reproducible?
似乎HashMaps不应该改变,但它根本不能保证,它可以在HashMap实现发生变化的最初时刻发生变化。
现在,这个问题应该集中在QPID方面。