@Inject private ZKQueueService(ZKClient zkClient) { ImmutableMap.Builder<QueueType, QueueGroup> builder = ImmutableMap.builder(); for (QueueType type : QueueType.GROUP_TYPES) { builder.put(type, new ZKQueueGroup(zkClient, type)); } this.queueGroups = builder.build(); }
@Override protected void startUp() throws Exception { Futures.getUnchecked(ZKClientExt.ensureExists(zkClient, queueType.getPath())); refreshQueues(Futures.getUnchecked(zkClient.getChildren(queueType.getPath()))); ZKOperations.watchChildren(zkClient, queueType.getPath(), new ZKOperations.ChildrenCallback() { @Override public void updated(NodeChildren nodeChildren) { refreshQueues(nodeChildren); } }); }
@Test public void testInstanceInitializedWithExistingData() throws Exception { QueueGroup instance1 = new ZKQueueGroup(zkClient, QueueType.PROVISIONER); instance1.startAndWait(); instance1.add("tenant1", new Element("val1")); instance1.add("tenant2", new Element("val2")); QueueGroup instance2 = new ZKQueueGroup(zkClient, QueueType.PROVISIONER); instance2.startAndWait(); waitForQueueNames(Sets.newHashSet("tenant1", "tenant2"), instance2); instance1.stop(); instance2.stop(); }
@Test public void testChangesSeenAcrossInstances() throws Exception { QueueGroup instance1 = new ZKQueueGroup(zkClient, QueueType.PROVISIONER); QueueGroup instance2 = new ZKQueueGroup(zkClient, QueueType.PROVISIONER); instance1.startAndWait(); instance2.startAndWait(); // add a queue for tenant3 with 2 elements String tenant = "tenantX"; Set<String> expectedQueueNames = Sets.newHashSet(tenant); instance1.add(tenant, new Element("id3-1", "val1")); instance1.add(tenant, new Element("id3-2", "val2")); // check both instances see tenant3 Assert.assertEquals(expectedQueueNames, instance1.getQueueNames()); waitForQueueNames(expectedQueueNames, instance2); // make sure each instance gets an accurate picture of the queue Iterator<GroupElement> queuesIter1 = instance1.takeIterator("consumer1"); Iterator<GroupElement> queuesIter2 = instance1.takeIterator("consumer2"); GroupElement gelement = queuesIter1.next(); Assert.assertEquals(tenant, gelement.getQueueName()); Assert.assertEquals("id3-1", gelement.getElement().getId()); Assert.assertEquals("val1", gelement.getElement().getValue()); gelement = queuesIter2.next(); Assert.assertEquals(tenant, gelement.getQueueName()); Assert.assertEquals("id3-2", gelement.getElement().getId()); Assert.assertEquals("val2", gelement.getElement().getValue()); Assert.assertFalse(queuesIter1.hasNext()); Assert.assertFalse(queuesIter2.hasNext()); instance1.stop(); instance2.stop(); }