GridGain™ 4.3.1e
Enterprise "Big Data" Edition

org.gridgain.grid.gridify
Annotation Type Gridify


@Documented
@Retention(value=RUNTIME)
@Target(value=METHOD)
public @interface Gridify

Start Here  Gridify annotation is the main way to grid-enable existing code.

This annotation can be applied to any public method that needs to be grid-enabled, static or non-static. When this annotation is applied to a method, the method execution is considered to be grid-enabled. In general, the execution of this method can be transferred to another node in the grid, potentially splitting it into multiple subtasks to be executed in parallel on multiple grid nodes. But from the caller perspective this method still looks and behaves like a local apply. This is achieved by utilizing AOP-based interception of the annotated code and injecting all the necessary grid logic into the method execution.

By default, when neither Gridify.taskClass() or Gridify.taskName() are specified a method with @Gridify annotation will be executed on randomly picked remote node.

Note that when using @Gridify annotation with default task (without specifying explicit grid task), the state of the whole instance will be serialized and sent out to remote node. Therefore the class must implement Serializable interface. If you cannot make the class Serializable, then you must implement custom grid task which will take care of proper state initialization (see HelloWorld - Gridify With State example). In either case, GridGain must be able to serialize the state passed to remote node.

Refer to GridTask documentation for more information on how a task can be split into multiple sub-jobs.

Java Example

Here is a simple example how to grid-enable a Java method. The method sayIt with @Gridify annotation will be executed on remote node.
 ...
 @Gridify
 public static void sayIt(String arg) {
    // Simply print out the argument.
    System.out.println(arg);
 }
 ...
 
Here is an example of how to grid-enable a Java method with custom task. The custom task logic will provide a way to split and aggregate the result. The method sayIt will be executed on remote node.
 public class GridifyHelloWorldTaskExample {
     ...
     @Gridify(taskClass = GridifyHelloWorldTask.class, timeout = 3000)
     public static integer sayIt(String arg) {
         // Simply print out the argument.
         System.out.println(">>> Printing '" + arg + "' on this node from grid-enabled method.");

         return arg.length();
     }
     ...
 }
 
The custom task will actually take the String passed into sayIt(String) method, split it into words and execute every word on different remote node.
 public class GridifyHelloWorldTask extends GridifyTaskSplitAdapter<Integer> {
    @Override public Integer apply(String e) {
        return F.outJobs(F.yield(((String)arg.getMethodParameters()[0]).split(" "), new C1<String, Integer>() {
            @Override public Integer apply(String e) {
                // Note that no recursive cross-cutting will happen here.
                return GridifyHelloWorldTaskExample.sayIt(e);
            }
        }));
    }

    public Integer reduce(List<GridJobResult> results) throws GridException {
        return results.size() - 1 + F.sum(F.<Integer>jobResults(results));
    }
 }
 

Jboss AOP

The following configuration needs to be applied to enable JBoss byte code weaving. Note that GridGain is not shipped with JBoss and necessary libraries will have to be downloaded separately (they come standard if you have JBoss installed already):

AspectJ AOP

The following configuration needs to be applied to enable AspectJ byte code weaving.

Spring AOP

Spring AOP framework is based on dynamic proxy implementation and doesn't require any specific runtime parameters for online weaving.

Note that this method of weaving is rather inconvenient and AspectJ or JBoss AOP is recommended over it. Spring AOP can be used in situation when code augmentation is undesired and cannot be used. It also allows for very fine grained control of what gets weaved.

 

Optional Element Summary
 String gridName
          Name of the grid to use.
 Class<? extends GridifyInterceptor> interceptor
          Optional interceptor class.
 Class<? extends GridTask<GridifyArgument,?>> taskClass
          Optional gridify task class.
 String taskName
          Optional gridify task name.
 long timeout
          Optional gridify task execution timeout.
 

taskName

public abstract String taskName
Optional gridify task name. Note that either this name or Gridify.taskClass() must be specified - but not both. If neither one is specified tasks' fully qualified name will be used as a default name.

Default:
""

taskClass

public abstract Class<? extends GridTask<GridifyArgument,?>> taskClass
Optional gridify task class. Note that either this name or Gridify.taskName() must be specified - but not both. If neither one is specified tasks' fully qualified name will be used as a default name.

Default:
org.gridgain.grid.gridify.aop.GridifyDefaultTask.class

timeout

public abstract long timeout
Optional gridify task execution timeout. Default is 0 which indicates that task will not timeout.

Default:
0L

interceptor

public abstract Class<? extends GridifyInterceptor> interceptor
Optional interceptor class. Since null are not supported the value of GridifyInterceptor.class acts as a default value.

Default:
org.gridgain.grid.gridify.GridifyInterceptor.class

gridName

public abstract String gridName
Name of the grid to use. By default, no-name default grid is used. Refer to GridFactory for information about named grids.

Default:
""

GridGain™ 4.3.1e
Enterprise "Big Data" Edition

GridGain - In-Memory Big Data
Enterprise "Big Data" Edition, ver. 4.3.1e.10112012
2012 Copyright © GridGain Systems
Follow us:   Follow GridGain on Github Join GridGain User Group Follow GridGain on Twitter Follow GridGain on Vimeo