项目使用到activeMQ,在使用过程中遇到一个问题,我使用多个线程去读取队列,每个线程使用一个queue的连接对象,这些连接对象都读取ActiveMQ中的同一个消息队列。但发现只有第一个队列可以循环读取,别的队列都读取到null,但使用activeMQ的控制台查看,队列里还有20多个消息呢,后来google才知道,原来为了性能优化,ActiveMQ为每个open的链接预抓取一个数量的消息(默认情况是100个),也就是说第一个打来的连接将队列里20多个消息都预锁定了,第二个连接读取就为空了。为了避免这样的情况,可以设置预读取为1,使用jms.prefetchPolicy.queuePrefetch参数加载open的url后面如:tcp://localhost:61616?jms.prefetchPolicy.queuePrefetch=1。
但我加上后,死活连接不上,经过google上百度一下,才知道我这样的写法不对:
failover:(tcp://localhost:61616?jms.prefetchPolicy.queuePrefetch=1&wireFormat.maxInactivityDuration)其中wireFormat.maxInactivityDuration是心跳参数。
我尝试去掉wireFormat.maxInactivityDuration参数也不行。
最后才知道wireFormat.maxInactivityDuration参数和jms.prefetchPolicy.queuePrefetch参数位置写反了(这个很莫名)
需要这样写才正确:
failover:(tcp://localhost:61616?wireFormat.maxInactivityDuration)?jms.prefetchPolicy.queuePrefetch=1
但我加上后,死活连接不上,经过google上百度一下,才知道我这样的写法不对:
failover:(tcp://localhost:61616?jms.prefetchPolicy.queuePrefetch=1&wireFormat.maxInactivityDuration)其中wireFormat.maxInactivityDuration是心跳参数。
我尝试去掉wireFormat.maxInactivityDuration参数也不行。
最后才知道wireFormat.maxInactivityDuration参数和jms.prefetchPolicy.queuePrefetch参数位置写反了(这个很莫名)
需要这样写才正确:
failover:(tcp://localhost:61616?wireFormat.maxInactivityDuration)?jms.prefetchPolicy.queuePrefetch=1