QPID消息元素顺序

时间:2014-04-02 11:37:27

标签: java hashmap jms qpid

我维护一个使用Apache QPID作为消息交换中间件的系统。它的客户端大多是用Java编写的,使用JMS作为Java的QPID抽象层。

另一方面,我通常使用一个客户端,也使用相同的技术集用Java编写,我用它来监听一些EXCHANGE / TOPICS作为监控工具。

一切工作都很完美,但我很感兴趣的是,消息元素的顺序因包含完全相同信息的消息而异,更重要的是,使用相同的算法生成。

enter image description here enter image description here

正如您在下面的代码片段中所看到的,我遍历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遍历它的位置调试了应用程序,我也可以看到顺序上的差异。

这根本不影响系统,但我想知道:

  1. 如果两个HashMaps填充了相同的键,其元素以相同的顺序插入,则会在其键上生成相同的迭代顺序。正如我上面所写,我倾向于认为他们这样做。
  2. 如果QPID更改其消息元素的顺序以生成某种alignnment,从而优化传输。或者JMS层可以更改此顺序吗?
  3. 编辑

    我认为这个问题的第一部分值得提出自己的问题: Is the order of HashMap elements reproducible?

    似乎HashMaps不应该改变,但它根本不能保证,它可以在HashMap实现发生变化的最初时刻发生变化。

    现在,这个问题应该集中在QPID方面。

0 个答案:

没有答案