ここでは、Java 言語バインドを使用するアプリケーション対話例をいくつか紹介します。Grid Engine Community サイトの「Howtos」セクションでも、そのほかの例を紹介しています。
次のコードセグメントは、もっとも基本的な DRMAA Java バインドプログラムの例です。
プログラマが DRMAA を使用して行うことのすべては、Session オブジェクトを介して行います。Session オブジェクトは、SessionFactory から取得します。SessionFactory は、静的な SessionFactory.getFactory() メソッドから取得します。この連鎖の理由は、すべての org.ggf.drmaa.* クラスが、あらゆる DRMAA Java 言語バインド実装によって使用される不変のパッケージとみなされるべきであるためです。パッケージが不変であるため、特定の実装を読み込む際、SessionFactory はシステムプロパティーを使用して、その実装のセッションファクトリを探し、読み込みます。そして、このセッションファクトリが、適当とみなす方法でセッションを作成します。セッションファクトリが存在するとしても、一度に存在できるセッションは 1 つだけであることに注意してください。
行 9 の SessionFactory.getFactory() はセッションファクトリインスタンスを取得します。行 10 の SessionFactory.getSession () はセッションインスタンスを取得します。行 13 の Session.init () はセッションを初期化します。"" は、初期化引数が必要ないため、新しいセッションを作成するための連絡文字列として渡されます。
Session.init() はセッションを作成し、イベントクライアントリスナースレッドの実行を開始します。このセッションは DRMAA を使用して発行されたジョブを整理するためのもので、スレッドはジョブの状態およびシステム全般に関する最新情報をキューマスターから受け取ります。Session.init() が正しく呼び出されたあと、呼び出し元アプリケーションは、終了する前に Session.()exit() の呼び出しも行います。終了する前にアプリケーションが Session.()exit() を呼び出さないと、キューマスターに無効なイベントクライアントハンドルが残り、キューマスターのパフォーマンスが低下することがあります。Session.()exit() が呼び出されていることを確認するには、Runtime.addShutdownHook() メソッドを使用します。exit() gets called.
プログラムの終了時の 行 14 の Session.()exit() は、セッションのクリーンアップをして、イベントクライアントリスナースレッドを停止します。ほかの大部分の DRMAA メソッドは、Session.()exit() の前に呼び出します。Session.getContact() のように、Session.()exit() の後で呼び出せる関数もありますが、これら関数は一般的な情報を提供するだけです。Session.runJob() または Session.()wait() のようにアクションを実行する関数は、Session.()exit() を呼び出す前に呼び出します。Session.()exit() を呼び出したあとでこのような関数を呼び出すと、「NoActiveSessionException」がスローされます。
01: package com.sun.grid.drmaa.howto; 02: 03: import org.ggf.drmaa.DrmaaException; 04: import org.ggf.drmaa.Session; 05: import org.ggf.drmaa.SessionFactory; 06: 07: public class Howto1 { 08: public static void main(String[] args) { 09: SessionFactory factory = SessionFactory.getFactory(); 10: Session session = factory.getSession(); 11: 12: try { 13: session.init(""); 14: session.exit(); 15: } catch (DrmaaException e) { 16: System.out.println("Error: " + e.getMessage()); 17: } 18: } 19: }
次は、DRMAA Java 言語バインドを使用して N1 Grid Engine にジョブを発行するコードセグメントの例です。このプログラムの最初と最後は、例 6–4 と同じです。違いは行 16 〜 24 にあります。
行 16 では、DRMAA がジョブテンプレートを割り当てています。ジョブテンプレートは、発行するジョブの情報を格納するためのオブジェクトです。Session.runJob () または Session.runBulkJobs() の複数の呼び出しでは、同じテンプレートを再利用できます。
行 17 では、remoteCommand 属性を設定しています。この属性は、実行するプログラムがある場所を DRMAA に伝えます。この属性の値は、実行可能ファイルへのパスです。パスは相対または絶対のどちらでもかまいません。相対の場合は、workingDirectory 属性を基準にしたパスで、デフォルトではユーザーのホームディレクトリです。DRMAA の属性については、DRMAA Javadoc または drmaa_attributes のマニュアルページを参照してください。このプログラムが動作するには、sleeper.sh スクリプトがデフォルトパスになければなりません。
行 18 では、args 属性を設定しています。この属性は、実行可能ファイルに渡す引数を DRMAA に伝えます。DRMAA の属性については、DRMAA Javadoc または drmaa_attributes のマニュアルページを参照してください。
行 20 の Session.runJob() はジョブを発行します。このメソッドは、キューマスターがジョブに割り当てた ID を返します。これで、ジョブは qsub によって発行されたかのように動作します。この時点で Session.()exit() を呼び出すか、プログラムを終了しても、ジョブは何の影響も受けません。
クリーンアップするために、行 24 でジョブテンプレートが削除されます。これによって、ジョブテンプレート用に DRMAA が確保していたメモリーが解放されますが、発行されたジョブは何の影響も受けません。
01: package com.sun.grid.drmaa.howto; 02: 03: import java.util.Collections; 04: import org.ggf.drmaa.DrmaaException; 05: import org.ggf.drmaa.JobTemplate; 06: import org.ggf.drmaa.Session; 07: import org.ggf.drmaa.SessionFactory; 08: 09: public class Howto2 { 10: public static void main(String[] args) { 11: SessionFactory factory = SessionFactory.getFactory(); 12: Session session = factory.getSession(); 13: 14: try { 15: session.init(""); 16: JobTemplate jt = session.createJobTemplate(); 17: jt.setRemoteCommand("sleeper.sh"); 18: jt.setArgs(Collections.singletonList("5")); 19: 20: String id = session.runJob(jt); 21: 22: System.out.println("Your job has been submitted with id " + id); 23: 24: session.deleteJobTemplate(jt); 25: session.exit(); 26: } catch (DrmaaException e) { 27: System.out.println("Error: " + e.getMessage()); 28: } 29: } 30: }