T - Type of the task argument that is passed into map(List, Object) method.R - Type of the task result returning from reduce(List) method.public interface GridComputeTask<T,R> extends Serializable
GridCompute.localDeployTask(Class, ClassLoader) method), however if task does not specify
its name explicitly via @GridComputeTaskName annotation, it
will be auto-deployed first time it gets executed.
GridComputeTaskSession).
map(List, Object). This
method is responsible for splitting business logic of grid task into
multiple grid jobs (units of execution) and mapping them to
grid nodes. Method map(List, Object) returns
a map of with grid jobs as keys and grid node as values.
GridCollisionSpi) which will determine how a job will be executed
on the remote node (immediately, buffered or canceled).
result(GridComputeJobResult, List)
will be called for each received job result. The policy returned by this method will
determine the way task reacts to every job result:
GridComputeJobResultPolicy.WAIT policy is returned, task will continue to wait
for other job results. If this result is the last job result, then
reduce(List) method will be called.
GridComputeJobResultPolicy.REDUCE policy is returned, then method
reduce(List) will be called right away without waiting for
other jobs' completion (all remaining jobs will receive a cancel request).
GridComputeJobResultPolicy.FAILOVER policy is returned, then job will
be failed over to another node for execution. The node to which job will get
failed over is decided by GridFailoverSpi SPI implementation.
Note that if you use GridComputeTaskAdapter adapter for GridComputeTask
implementation, then it will automatically fail jobs to another node for 2
known failure cases:
GridComputeJobResult.getException()
method will return an instance of GridTopologyException exception.
GridComputeJobResult.getException() method will return an instance of
GridComputeExecutionRejectedException exception.
result(GridComputeJobResult, List)
method returned GridComputeJobResultPolicy.REDUCE policy, method reduce(List)
is called to aggregate received results into one final result. Once this method is finished the
execution of the grid task is complete. This result will be returned to the user through
GridComputeTaskFuture.get() method.
map(List, Object) step,
use GridComputeTaskContinuousMapper to continuously stream jobs from task even after map(...)
step is complete. Usually with continuous mapper the number of jobs within task
may grow too large - in this case it may make sense to use it in combination with
@GridComputeTaskNoResultCache annotation.
@GridComputeTaskNoResultCache annotation to task class, and
processing all results as they come in result(GridComputeJobResult, List) method.
When GridGain sees this annotation it will disable tracking of job results and
list of all job results passed into result(GridComputeJobResult, List) or
reduce(List) methods will always be empty. Note that list of
job siblings on GridComputeTaskSession will also be empty to prevent number
of job siblings from growing as well.
GridTaskSessionResourceGridInstanceResourceGridLoggerResourceGridHomeResourceGridExecutorServiceResourceGridLocalNodeIdResourceGridMBeanServerResourceGridMarshallerResourceGridSpringApplicationContextResourceGridSpringResource
GridComputeTask comes with several convenience adapters to make the usage easier:
GridComputeTaskAdapter provides default implementation for result(GridComputeJobResult, List)
method which provides automatic fail-over to another node if remote job has failed
due to node crash (detected by GridTopologyException exception) or due to job
execution rejection (detected by GridComputeExecutionRejectedException exception).
Here is an example of how a you would implement your task using GridComputeTaskAdapter:
public class MyFooBarTask extends GridComputeTaskAdapter<String, String> {
// Inject load balancer.
@GridLoadBalancerResource
GridComputeLoadBalancer balancer;
// Map jobs to grid nodes.
public Map<? extends GridComputeJob, GridNode> map(List<GridNode> subgrid, String arg) throws GridException {
Map<MyFooBarJob, GridNode> jobs = new HashMap<MyFooBarJob, GridNode>(subgrid.size());
// In more complex cases, you can actually do
// more complicated assignments of jobs to nodes.
for (int i = 0; i < subgrid.size(); i++) {
// Pick the next best balanced node for the job.
jobs.put(new MyFooBarJob(arg), balancer.getBalancedNode())
}
return jobs;
}
// Aggregate results into one compound result.
public String reduce(List<GridComputeJobResult> results) throws GridException {
// For the purpose of this example we simply
// concatenate string representation of every
// job result
StringBuilder buf = new StringBuilder();
for (GridComputeJobResult res : results) {
// Append string representation of result
// returned by every job.
buf.append(res.getData().string());
}
return buf.string();
}
}
GridComputeTaskSplitAdapter hides the job-to-node mapping logic from
user and provides convenient GridComputeTaskSplitAdapter.split(int, Object)
method for splitting task into sub-jobs in homogeneous environments.
Here is an example of how you would implement your task using GridComputeTaskSplitAdapter:
public class MyFooBarTask extends GridComputeTaskSplitAdapter<Object, String> {
@Override
protected Collection<? extends GridComputeJob> split(int gridSize, Object arg) throws GridException {
List<MyFooBarJob> jobs = new ArrayList<MyFooBarJob>(gridSize);
for (int i = 0; i < gridSize; i++) {
jobs.add(new MyFooBarJob(arg));
}
// Node assignment via load balancer
// happens automatically.
return jobs;
}
// Aggregate results into one compound result.
public String reduce(List<GridComputeJobResult> results) throws GridException {
// For the purpose of this example we simply
// concatenate string representation of every
// job result
StringBuilder buf = new StringBuilder();
for (GridComputeJobResult res : results) {
// Append string representation of result
// returned by every job.
buf.append(res.getData().string());
}
return buf.string();
}
}
| Modifier and Type | Method and Description |
|---|---|
Map<? extends GridComputeJob,GridNode> |
map(List<GridNode> subgrid,
T arg)
This method is called to map or split grid task into multiple grid jobs.
|
R |
reduce(List<GridComputeJobResult> results)
Reduces (or aggregates) results received so far into one compound result to be returned to
caller via
GridComputeTaskFuture.get() method. |
GridComputeJobResultPolicy |
result(GridComputeJobResult res,
List<GridComputeJobResult> rcvd)
Asynchronous callback invoked every time a result from remote execution is
received.
|
@Nullable Map<? extends GridComputeJob,GridNode> map(List<GridNode> subgrid, @Nullable T arg) throws GridException
arg - Task execution argument. Can be null. This is the same argument
as the one passed into Grid#execute(...) methods.subgrid - Nodes available for this task execution. Note that order of nodes is
guaranteed to be randomized by container. This ensures that every time
you simply iterate through grid nodes, the order of nodes will be random which
over time should result into all nodes being used equally.GridComputeTaskContinuousMapper is
injected into task, if null or empty map is returned, exception will be thrown.GridException - If mapping could not complete successfully. This exception will be
thrown out of GridComputeTaskFuture.get() method.GridComputeJobResultPolicy result(GridComputeJobResult res, List<GridComputeJobResult> rcvd) throws GridException
GridComputeJobResultPolicy for more information about result policies.res - Received remote grid executable result.rcvd - All previously received results. Note that if task class has
GridComputeTaskNoResultCache annotation, then this list will be empty.GridException - If handling a job result caused an error. This exception will
be thrown out of GridComputeTaskFuture.get() method.@Nullable R reduce(List<GridComputeJobResult> results) throws GridException
GridComputeTaskFuture.get() method.
Note, that if some jobs did not succeed and could not be failed over then the list of results passed into this method will include the failed results. Otherwise, failed results will not be in the list.
results - Received results of broadcasted remote executions. Note that if task class has
GridComputeTaskNoResultCache annotation, then this list will be empty.GridException - If reduction or results caused an error. This exception will
be thrown out of GridComputeTaskFuture.get() method.Copyright © 2014. All rights reserved.