@Test public void submitCallableToMembers_withExecutionCallback() { IExecutorService service = client.getExecutorService(randomString()); final CountDownLatch responseLatch = new CountDownLatch(CLUSTER_SIZE); final CountDownLatch completeLatch = new CountDownLatch(1); final String msg = randomString(); Callable callable = new AppendCallable(msg); MemberSelector selector = new SelectAllMembers(); service.submitToMembers( callable, selector, new MultiExecutionCallback() { public void onResponse(Member member, Object value) { if (value.equals(msg + AppendCallable.APPENDAGE)) { responseLatch.countDown(); } } public void onComplete(Map<Member, Object> values) { completeLatch.countDown(); } }); assertOpenEventually("responseLatch", responseLatch); assertOpenEventually("completeLatch", completeLatch); }
@Test public void submitRunnableToMembers_withExecutionCallback() { IExecutorService service = client.getExecutorService(randomString()); final CountDownLatch responseLatch = new CountDownLatch(CLUSTER_SIZE); final CountDownLatch completeLatch = new CountDownLatch(1); String mapName = randomString(); Runnable runnable = new MapPutRunnable(mapName); MemberSelector selector = new SelectAllMembers(); service.submitToMembers( runnable, selector, new MultiExecutionCallback() { public void onResponse(Member member, Object value) { responseLatch.countDown(); } public void onComplete(Map<Member, Object> values) { completeLatch.countDown(); } }); IMap map = client.getMap(mapName); assertOpenEventually("responseLatch", responseLatch); assertOpenEventually("completeLatch", completeLatch); assertEquals(CLUSTER_SIZE, map.size()); }
@Test public void submitCallableToMember_withMultiExecutionCallback() throws Exception { IExecutorService service = client.getExecutorService(randomString()); final CountDownLatch responseLatch = new CountDownLatch(CLUSTER_SIZE); final CountDownLatch completeLatch = new CountDownLatch(CLUSTER_SIZE); final String msg = randomString(); Callable<String> callable = new AppendCallable(msg); Collection<Member> collection = server.getCluster().getMembers(); service.submitToMembers( callable, collection, new MultiExecutionCallback() { public void onResponse(Member member, Object value) { if (value.equals(msg + AppendCallable.APPENDAGE)) { responseLatch.countDown(); } } public void onComplete(Map<Member, Object> values) { for (Member member : values.keySet()) { Object value = values.get(member); if (value.equals(msg + AppendCallable.APPENDAGE)) { completeLatch.countDown(); } } } }); assertOpenEventually("responseLatch", responseLatch); assertOpenEventually("completeLatch", completeLatch); }
/** * Submits a task to multiple members of the Hazelcast task cluster. * * @param task The task * @param where A {@link MemberSelector}, an {@link Iterable} of {@link Member}, a string * (comma-separated member tags), or null for all members * @return A map of members to futures for the task */ @SuppressWarnings("unchecked") private <T> Map<Member, Future<T>> multiTask(SerializableApplicationTask<T> task, Object where) { IExecutorService executor = getHazelcastExecutorService(); if (where instanceof String) return executor.submitToMembers( task, new TaggedMembers(HAZELCAST_MEMBER_TAGS_ATTRIBUTE, (String) where)); else if (where instanceof MemberSelector) return executor.submitToMembers(task, (MemberSelector) where); else if (where instanceof Collection) return executor.submitToMembers(task, (Collection<Member>) where); else if (where instanceof Iterable) { ArrayList<Member> members = new ArrayList<Member>(); for (Member member : (Iterable<Member>) where) members.add(member); return executor.submitToMembers(task, members); } else return executor.submitToAllMembers(task); }
@Test public void testSubmitCallableToMembers_withMemberSelector() throws Exception { IExecutorService service = client.getExecutorService(randomString()); Callable<String> getUuidCallable = new GetMemberUuidTask(); MemberSelector selectAll = new SelectAllMembers(); Map<Member, Future<String>> map = service.submitToMembers(getUuidCallable, selectAll); for (Member member : map.keySet()) { Future<String> result = map.get(member); String uuid = result.get(); assertEquals(member.getUuid(), uuid); } }
@Test public void testSubmitToMembersRunnable() throws InterruptedException { final int k = simpleTestNodeCount; TestHazelcastInstanceFactory factory = createHazelcastInstanceFactory(k); final HazelcastInstance[] instances = factory.newInstances(new Config()); final AtomicInteger count = new AtomicInteger(0); final CountDownLatch latch = new CountDownLatch(k); final MultiExecutionCallback callback = new MultiExecutionCallback() { public void onResponse(Member member, Object value) { count.incrementAndGet(); } public void onComplete(Map<Member, Object> values) { latch.countDown(); } }; int sum = 0; final Set<Member> membersSet = instances[0].getCluster().getMembers(); final Member[] members = membersSet.toArray(new Member[membersSet.size()]); final Random random = new Random(); for (int i = 0; i < k; i++) { final IExecutorService service = instances[i].getExecutorService("testSubmitToMembersRunnable"); final String script = "hazelcast.getAtomicLong('testSubmitToMembersRunnable').incrementAndGet();"; final int n = random.nextInt(k) + 1; sum += n; Member[] m = new Member[n]; System.arraycopy(members, 0, m, 0, n); service.submitToMembers(new ScriptRunnable(script, null), Arrays.asList(m), callback); } assertTrue(latch.await(30, TimeUnit.SECONDS)); final IAtomicLong result = instances[0].getAtomicLong("testSubmitToMembersRunnable"); assertEquals(sum, result.get()); assertEquals(sum, count.get()); }