private <V> IScheduledFuture<V> createFutureProxy(Address address, String taskName) { return createFutureProxy(ScheduledTaskHandlerImpl.of(address, getName(), taskName)); }
@Override public IScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) { checkNotNull(command, "Command is null"); checkNotNull(unit, "Unit is null"); String name = extractNameOrGenerateOne(command); int partitionId = getTaskOrKeyPartitionId(command, name); Callable adapter = createScheduledRunnableAdapter(command); TaskDefinition definition = new TaskDefinition(TaskDefinition.Type.AT_FIXED_RATE, name, adapter, initialDelay, period, unit); return scheduleOnPartition(name, definition, partitionId); }
@Override public <V> Map<Member, IScheduledFuture<V>> scheduleOnAllMembers(Callable<V> command, long delay, TimeUnit unit) { return scheduleOnMembers(command, getContext().getClusterService().getMemberList(), delay, unit); }
@Override public IScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) { Callable adapter = createScheduledRunnableAdapter(command); return schedule(adapter, delay, unit); }
@Override public IScheduledFuture<?> scheduleOnKeyOwner(Runnable command, Object key, long delay, TimeUnit unit) { Callable adapter = createScheduledRunnableAdapter(command); return scheduleOnKeyOwner(adapter, key, delay, unit); }
@Override public Map<Member, IScheduledFuture<?>> scheduleOnMembers(Runnable command, Collection<Member> members, long delay, TimeUnit unit) { Callable adapter = createScheduledRunnableAdapter(command); return scheduleOnMembers(adapter, members, delay, unit); }
private <V> IScheduledFuture<V> scheduleOnPartition(String name, TaskDefinition definition, int partitionId) { TimeUnit unit = definition.getUnit(); Data commandData = getSerializationService().toData(definition.getCommand()); ClientMessage request = ScheduledExecutorSubmitToPartitionCodec.encodeRequest(getName(), definition.getType().getId(), definition.getName(), commandData, unit.toMillis(definition.getInitialDelay()), unit.toMillis(definition.getPeriod())); try { new ClientInvocation(getClient(), request, getName(), partitionId).invoke().get(); } catch (Exception e) { throw rethrow(e); } return createFutureProxy(partitionId, name); }
@Override public IScheduledFuture<?> scheduleOnKeyOwnerAtFixedRate(Runnable command, Object key, long initialDelay, long period, TimeUnit unit) { checkNotNull(command, "Command is null"); checkNotNull(key, "Key is null"); checkNotNull(unit, "Unit is null"); String name = extractNameOrGenerateOne(command); int partitionId = getKeyPartitionId(key); Callable adapter = createScheduledRunnableAdapter(command); TaskDefinition definition = new TaskDefinition(TaskDefinition.Type.AT_FIXED_RATE, name, adapter, initialDelay, period, unit); return scheduleOnPartition(name, definition, partitionId); }
private <T> ClientDelegatingFuture<T> doSubmitOnAddress(ClientMessage clientMessage, ClientMessageDecoder clientMessageDecoder, Address address) { try { ClientInvocationFuture future = new ClientInvocation(getClient(), clientMessage, getName(), address).invoke(); return new ClientDelegatingFuture<T>(future, getSerializationService(), clientMessageDecoder); } catch (Exception e) { throw rethrow(e); } } }
@Override public <V> IScheduledFuture<V> scheduleOnKeyOwner(Callable<V> command, Object key, long delay, TimeUnit unit) { checkNotNull(command, "Command is null"); checkNotNull(key, "Key is null"); checkNotNull(unit, "Unit is null"); String name = extractNameOrGenerateOne(command); int partitionId = getKeyPartitionId(key); TaskDefinition definition = new TaskDefinition(TaskDefinition.Type.SINGLE_RUN, name, command, delay, unit); return scheduleOnPartition(name, definition, partitionId); }
@Override public <V> IScheduledFuture<V> schedule(Callable<V> command, long delay, TimeUnit unit) { checkNotNull(command, "Command is null"); checkNotNull(unit, "Unit is null"); String name = extractNameOrGenerateOne(command); int partitionId = getTaskOrKeyPartitionId(command, name); TaskDefinition<V> definition = new TaskDefinition<V>(TaskDefinition.Type.SINGLE_RUN, name, command, delay, unit); return scheduleOnPartition(name, definition, partitionId); }
@Override public void shutdown() { Collection<Member> members = getContext().getClusterService().getMemberList(); Collection<Future> calls = new LinkedList<Future>(); for (Member member : members) { ClientMessage request = ScheduledExecutorShutdownCodec.encodeRequest(getName(), member.getAddress()); calls.add(doSubmitOnAddress(request, SUBMIT_DECODER, member.getAddress())); } waitWithDeadline(calls, SHUTDOWN_TIMEOUT, TimeUnit.SECONDS, shutdownExceptionHandler); }
@Override public Map<Member, IScheduledFuture<?>> scheduleOnMembersAtFixedRate(Runnable command, Collection<Member> members, long initialDelay, long period, TimeUnit unit) { checkNotNull(command, "Command is null"); checkNotNull(members, "Members is null"); checkNotNull(unit, "Unit is null"); String name = extractNameOrGenerateOne(command); Callable adapter = createScheduledRunnableAdapter(command); Map<Member, IScheduledFuture<?>> futures = new HashMap<Member, IScheduledFuture<?>>(); for (Member member : members) { TaskDefinition definition = new TaskDefinition( TaskDefinition.Type.AT_FIXED_RATE, name, adapter, initialDelay, period, unit); futures.put(member, scheduleOnMember(name, member, definition)); } return futures; }
@Override public <V> Map<Member, List<IScheduledFuture<V>>> getAllScheduledFutures() { ClientMessage request = ScheduledExecutorGetAllScheduledFuturesCodec.encodeRequest(getName()); ClientInvocationFuture future = new ClientInvocation(getClient(), request, getName()).invoke(); ClientMessage response; try { response = future.get(); } catch (Exception e) { throw rethrow(e); } Collection<Map.Entry<Member, List<ScheduledTaskHandler>>> urnsPerMember = ScheduledExecutorGetAllScheduledFuturesCodec.decodeResponse(response).handlers; Map<Member, List<IScheduledFuture<V>>> tasksMap = new HashMap<Member, List<IScheduledFuture<V>>>(); for (Map.Entry<Member, List<ScheduledTaskHandler>> entry : urnsPerMember) { List<IScheduledFuture<V>> memberTasks = new ArrayList<IScheduledFuture<V>>(); for (ScheduledTaskHandler scheduledTaskHandler : entry.getValue()) { memberTasks.add(new ClientScheduledFutureProxy(scheduledTaskHandler, getContext())); } tasksMap.put(entry.getKey(), memberTasks); } return tasksMap; }
@Override public Map<Member, IScheduledFuture<?>> scheduleOnAllMembersAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) { return scheduleOnMembersAtFixedRate(command, getContext().getClusterService().getMemberList(), initialDelay, period, unit); }
@Override public <V> Map<Member, IScheduledFuture<V>> scheduleOnMembers(Callable<V> command, Collection<Member> members, long delay, TimeUnit unit) { checkNotNull(command, "Command is null"); checkNotNull(members, "Members is null"); checkNotNull(unit, "Unit is null"); String name = extractNameOrGenerateOne(command); Map<Member, IScheduledFuture<V>> futures = new HashMap<Member, IScheduledFuture<V>>(); for (Member member : members) { TaskDefinition definition = new TaskDefinition( TaskDefinition.Type.SINGLE_RUN, name, command, delay, unit); futures.put(member, (IScheduledFuture<V>) scheduleOnMember(name, member, definition)); } return futures; }
@Override public <V> IScheduledFuture<V> getScheduledFuture(ScheduledTaskHandler handler) { ClientScheduledFutureProxy<V> futureProxy = new ClientScheduledFutureProxy<V>(handler, getContext()); return futureProxy; }
private int getTaskOrKeyPartitionId(Runnable task, Object key) { if (task instanceof PartitionAware) { Object newKey = ((PartitionAware) task).getPartitionKey(); if (newKey != null) { key = newKey; } } return getKeyPartitionId(key); }
private int getKeyPartitionId(Object key) { return getClient().getPartitionService().getPartition(key).getPartitionId(); }
private <V> IScheduledFuture<V> scheduleOnPartition(String name, TaskDefinition definition, int partitionId) { TimeUnit unit = definition.getUnit(); Data commandData = getSerializationService().toData(definition.getCommand()); ClientMessage request = ScheduledExecutorSubmitToPartitionCodec.encodeRequest(getName(), definition.getType().getId(), definition.getName(), commandData, unit.toMillis(definition.getInitialDelay()), unit.toMillis(definition.getPeriod())); try { new ClientInvocation(getClient(), request, getName(), partitionId).invoke().get(); } catch (Exception e) { throw rethrow(e); } return createFutureProxy(partitionId, name); }