出于某种原因,在以下代码中,destinationSource.getQueues()
返回的是 aCopyOnWriteArraySet
而不是简单的Set
. 这是一个问题,因为 for 循环在满之前开始处理,Set
并且由于它的性质,CopyOnWriteArraySet
它只会处理Set
before 循环中的项目。我知道我可以Thread.sleep()
在那里扔一个,但这并不能解决根本问题。是否有任何理由将其作为 aCopyOnWriteArraySet
而不是 a返回Set
?还有什么方法可以迭代 aCopyOnWriteArraySet
以确保覆盖所有项目,即使是在迭代期间添加的项目?
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
ActiveMQConnection activeMQConnection = (ActiveMQConnection) connectionFactory.createConnection();
activeMQConnection.start();
DestinationSource destinationSource = activeMQConnection.getDestinationSource();
Set<ActiveMQQueue> queues = destinationSource.getQueues();
for(ActiveMQQueue queue : queues) {
queueNames.add(queue.getPhysicalName());
}
activeMQConnection.close()
编辑:这是我提出的解决方案,虽然它并不完美,但它确保您将获得所有队列,直到添加队列之间的时间超过 1 秒。
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
ActiveMQConnection activeMQConnection = (ActiveMQConnection) connectionFactory.createConnection();
activeMQConnection.start();
DestinationSource destinationSource = activeMQConnection.getDestinationSource();
Set<ActiveMQQueue> queues = destinationSource.getQueues();
do {
for(ActiveMQQueue queue : queues) {
String physcialName = queue.getPhysicalName();
if(!queueNames.contains(physcialName)) {
queueNames.add(physcialName);
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
log(e.toString());
}
}while(queueNames.size() < queues.size());
activeMQConnection.close();