/*
* Copyright (c) 2008-2017, Hazelcast, Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.hazelcast.durableexecutor;
import com.hazelcast.core.DistributedObject;
import com.hazelcast.spi.annotation.Beta;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.RejectedExecutionException;
/**
* Durable implementation of {@link ExecutorService}.
* DurableExecutor provides additional methods like executing tasks on a member who is owner of a specific key
* DurableExecutor also provides a way to retrieve the result of an execution with the given taskId.
* @see ExecutorService
*/
@Beta
public interface DurableExecutorService extends ExecutorService, DistributedObject {
/**
* Submits a value-returning task for execution and returns a
* Future representing the pending results of the task. The
* Future's {@code get} method will return the task's result upon
* successful completion.
* <p>
* <p>
* If you would like to immediately block waiting
* for a task, you can use constructions of the form
* {@code result = exec.submit(aCallable).get();}
* <p>
* <p>Note: The {@link Executors} class includes a set of methods
* that can convert some other common closure-like objects,
* for example, {@link java.security.PrivilegedAction} to
* {@link Callable} form so they can be submitted.
*
* @param task the task to submit
* @param <T> the type of the task's result
* @return a Future representing pending completion of the task
* @throws RejectedExecutionException if the task cannot be
* scheduled for execution
* @throws NullPointerException if the task is null
*/
<T> DurableExecutorServiceFuture<T> submit(Callable<T> task);
/**
* Submits a Runnable task for execution and returns a Future
* representing that task. The Future's {@code get} method will
* return the given result upon successful completion.
*
* @param task the task to submit
* @param result the result to return
* @param <T> the type of the result
* @return a Future representing pending completion of the task
* @throws RejectedExecutionException if the task cannot be
* scheduled for execution
* @throws NullPointerException if the task is null
*/
<T> DurableExecutorServiceFuture<T> submit(Runnable task, T result);
/**
* Submits a Runnable task for execution and returns a Future
* representing that task. The Future's {@code get} method will
* return {@code null} upon <em>successful</em> completion.
*
* @param task the task to submit
* @return a Future representing pending completion of the task
* @throws RejectedExecutionException if the task cannot be
* scheduled for execution
* @throws NullPointerException if the task is null
*/
DurableExecutorServiceFuture<?> submit(Runnable task);
/**
* Retrieves the result with the given taskId
*
* @param taskId combination of partitionId and sequence
* @param <T> the type of the task's result
* @return a Future representing pending completion of the task
*/
<T> Future<T> retrieveResult(long taskId);
/**
* Disposes the result with the given taskId
*
* @param taskId combination of partitionId and sequence
*/
void disposeResult(long taskId);
/**
* Retrieves and disposes the result with the given taskId
*
* @param taskId combination of partitionId and sequence
* @param <T> the type of the task's result
* @return a Future representing pending completion of the task
*/
<T> Future<T> retrieveAndDisposeResult(long taskId);
/**
* Executes a task on the owner of the specified key.
*
* @param command a task executed on the owner of the specified key
* @param key the specified key
*/
void executeOnKeyOwner(Runnable command, Object key);
/**
* Submits a task to the owner of the specified key and returns a Future
* representing that task.
*
* @param task task submitted to the owner of the specified key
* @param key the specified key
* @return a Future representing pending completion of the task
*/
<T> DurableExecutorServiceFuture<T> submitToKeyOwner(Callable<T> task, Object key);
/**
* Submits a task to the owner of the specified key and returns a Future
* representing that task.
*
* @param task task submitted to the owner of the specified key
* @param key the specified key
* @return a Future representing pending completion of the task
*/
DurableExecutorServiceFuture<?> submitToKeyOwner(Runnable task, Object key);
}