2007年12月16日 星期日

GridGain 程式開發(5) - Basic Grid Task

GridGain 程式開發入門

第一個 GridGain 的程式其實很容易撰寫,假設要在 Grid node 輸出 Hello World,只要使用以下寫法即可:
import org.gridgain.grid.*;
import org.gridgain.grid.gridify.*;

public class GridHelloWorldExample {
public static void main(String[] args) throws GridException {
//啟動 Grid Factory
GridFactory.start();

try {
//丟出 Grid Task 到 remote client 執行
sayIt("Hello World!");
} finally {
//停止 Grid Factory
GridFactory.stop(true);
}
}

@Gridify //設定 Gridify annotation
public static void sayIt(String msg) {
System.out.println(msg);
}
}
從上面範例中,可以看出,要在遠端的 Grid node 輸出 Hello World,只要在 method 前面加上「Gridify」這個 annotation 即可!


Basic Grid Task

這個部分是將 Hello World 字串拆開(以空白作間隔)後,分別傳到不同的 grid node 做輸出

GridHelloWorldExample.java
import org.gridgain.grid.*;
import org.gridgain.grid.gridify.*;

public class GridHelloWorldExample {
/**
* 執行 Grid 程式
* @param 命令列參數 此範例中並沒有使用上
* @throws GridException 錯誤發生時,會拋出的例外
*/

public static void main(String[] args) throws GridException {
//啟動 Grid Factory
GridFactory.start();

try {
//取得 grid instance,用來處理 grid task
Grid grid = GridFactory.getGrid();

//指定處理 Grid Task 的 class,並丟出所需要的參數
grid.execute(GridHelloWorldTask.class.getName(), "Hello this world").get();

System.out.println("\n=========== local 執行完畢 ===========\n");
} finally {
//停止 Grid Factory
GridFactory.stop(true);
}
}
}

GridHelloWorldTask.java
import org.gridgain.grid.*;
import java.util.*;
import java.io.*;

/**
* 將 task 拆成多個 job,必須 extends GridTaskSplitAdapter 這個 abstract class<br />
* 其中有兩個 method 必須實作,分別是 split 及 reduce
* 而此 GridTaskSplitAdapter 已經將 job 與 node 的配對資訊隱藏,讓程式開發更為簡易
* */
public class GridHelloWorldTask extends GridTaskSplitAdapter<String> {
/**
* split 是透過參數列中的兩個參數將 task 分開成多個 job<br />
* 並指定每個 job 的處理工作
* @param gridSize 目前 Grid Node 的數量
* @param arg 要被拆開的字串<br />
* (其型態是根據 GridTaskSplitAdapter 所用的型態,此處為 String)
*/

@Override
public Collection<? extends GridJob> split(int gridSize, String arg) throws GridException {

//將傳入的字串以空格做區隔存成 List 中的各元素
List<String> words = Arrays.asList(arg.split(" "));

//產生存放 GridJob 的 List 容器
List<GridJob> jobs = new ArrayList<GridJob>(words.size());

//指定 job 所要處理的工作,並加入 List 容器中
for(String word : words) {
jobs.add(new GridJobAdapter<String>(word) {

//遠端 grid node 接收到 job 後所要進行的工作
public Serializable execute() {
System.out.println("\n=========== remote 開始執行 ===========");
//getArgument() 為 GridJobAdapter 的 method,會回傳上面的 word 參數
System.out.println(">>>> 印出 " + this.getArgument());
System.out.println("=========== remote 執行完畢 ===========\n");

//必須回傳實作 Serializable 介面的 class instance
//此處不需回傳任何東西,因此就回傳 null
return null;
}

});
} //end loop

return jobs;
} //end split

/**
* reduce 的目的是將多個 job 所回傳的值匯集起來,並轉為單一物件輸出<br />
* 而這個物件會由 GridTaskFuture.get() 所取得<br />
* 此範例中不需回傳值,因此直接回傳 null
*/

@Override
public Object reduce(List<GridJobResult> arg0) throws GridException {
return null;
} //end resuce
}
假設額外啟動的 GridGain service 有兩個,加上原本 eclipse 所跑的一個,一共會被視為 3 個 grid node,因此上面的字串拆成三份後,每一份就會傳到 node 上去印出。

然而比較需要注意的是,在「GridHelloWorldExample.java」程式中印出 ">>>程式執行完畢...." 的字眼,只會出現在 eclipse 的 console output 上,原因是因為其他的 grid node 上僅會執行 GridHelloWorldTask.java 中 execute() method 中的內容。

沒有留言:

張貼留言