【发布时间】:2015-07-08 16:34:23
【问题描述】:
由于某些原因,在以下代码中,destinationSource.getQueues() 返回一个 CopyOnWriteArraySet 而不是简单的 Set。这是一个问题,因为 for 循环在 Set 已满之前开始处理,并且由于 CopyOnWriteArraySet 的性质,它只会在循环之前处理 Set 中的项目。我知道我可以在那里扔一个Thread.sleep(),但这并不能解决根本问题。是否有任何理由将其作为CopyOnWriteArraySet 而不是Set 返回?还有什么方法可以迭代 CopyOnWriteArraySet 以确保覆盖所有项目,即使是在迭代期间添加的项目?
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();
【问题讨论】:
-
您的问题/问题是什么?
-
更新的问题,抱歉,应该更具体
-
谢谢,解决方案奏效了!
标签: java concurrency set activemq copyonwritearraylist