我将一些数据添加到分布式队列中,我想知道如何获得有关谁是队列主节点以及谁是备份节点的信息。
谢谢, 比尔
答案 0 :(得分:2)
GridGain缓存队列是分布式的,即不同的元素可以存储在不同的节点上。如果缓存具有备份,则每个元素将在两个或多个节点上重复。因此,无法确定非并置队列的主节点或备份节点。
如果队列并置,则其所有项目将存储在一个节点上(如果您有许多小队列而不是一个大队列,则可以使用此项目)。在这种情况下,您可以获取此队列的主节点和备份节点,将队列名称传递给亲缘关系,如下所示:
// Create collocated queue (3rd parameter is true).
GridCacheQueue<String> queue = cache.dataStructures().queue("MyQueue", 100, true, true);
// Get primary and backup nodes using cache affinity.
Iterator<GridNode> nodes = cache.affinity().mapKeyToPrimaryAndBackups("MyQueue").iterator();
// First element in collection is always the primary node.
GridNode primary = nodes.next();
// Other nodes in collection are backup nodes.
GridNode backup1 = nodes.next();
GridNode backup2 = nodes.next();
在迭代缓存期间没有看到任何内容,因为队列元素是内部条目,因此只能通过GridCacheQueue API访问它们,但不能通过GridCache API访问。这是一个例子:
// Create or get a queue.
GridCacheQueue<String> queue = cache.dataStructures().queue("MyQueue", 100, false, true);
for (String item : queue)
System.out.println(item);
答案 1 :(得分:0)
到目前为止,我知道分布式队列基于GridGain缓存。但是,我运行以下代码,我得到空缓存。
GridCache<Object, Object> cache = grid.cache("partitioned_tx");
GridCacheDataStructures dataStruct = cache.dataStructures();
GridCacheQueue<String> queue = dataStruct.queue("myQueueName", 0, false, true);
for (int i = 0; i < 20; i++){
queue.add("Value-"+i);
}
GridCacheAffinity<Object> affinity = cache.affinity();
int part;
Collection<GridNode> nodes;
for(Object key:cache.keySet()){
System.out.println("key="+key.toString());
part = affinity.partition(key);
nodes = affinity.mapPartitionToPrimaryAndBackups(part);
for(GridNode node:nodes){
System.out.println("key of "+key.toString()+" is primary: "+affinity.isPrimary(node, key));
System.out.println("key of "+key.toString()+" is backup: "+affinity.isBackup(node, key));
}
}