Oracle® Fusion Middleware Oracle Business Intelligence Enterprise Editionジョブ・スケジューリング・ガイド 12c (12.2.1) E70056-01 |
|
前 |
次 |
この章では、Oracle BI Schedulerを使用して、Oracle Business Intelligenceの機能を拡張するJavaジョブと呼ばれるJavaプログラムをスケジュールする方法について説明します。Javaジョブは、ジョブ・マネージャでスタンドアロンのSchedulerジョブ(Windows)にするか、エージェントの末尾に追加されてリリース11gからアップグレードされたOracle BI Deliversの既存のJavaアクション(WindowsまたはUNIX)にできます。
リリース11gからアップグレードされた既存のJavaアクションは実行できますが、リリース12c (12.2.1)では作成できません。かわりに、このリリースで利用可能なEJBベースのJavaアクションを使用する必要があります。アクションの詳細は、『Oracle Fusion Middleware Oracle Business Intelligence Enterprise Editionユーザーズ・ガイド』を参照してください。
この章では、Oracle BI SchedulerのJavaジョブをプログラミングする方法について説明します。内容は次のとおりです。
Javaジョブは、Oracle BI SchedulerのかわりにJavaHostプロセスで実行されるJavaプログラムです。JavaジョブはJava EJBアクションとは異なります。1つのクラスでエントリ・ポイントが定義されているJavaジョブがJARファイルでデプロイされます。このクラスはSchedulerJavaExtensionインタフェースを実装する必要があります。ジョブのコンテキストは、入力SchedulerJobInfoパラメータにより提供されます。
この項の内容は次のとおりです。
ジョブ・マネージャの「ジョブの変更」とジョブの追加のダイアログでカスタムJavaジョブの追加と構成を行います。第3.2項「ジョブ・マネージャにおけるOracle BI Schedulerのジョブの追加」と第3.3項「ジョブ・マネージャにおけるOracle BI Schedulerのジョブの変更」を参照してください。
注意: ジョブをジョブ・マネージャで作成する前に、Oracle BI Schedulerのサーバー・コンピュータにJavaプログラムが存在する必要があります。Javaプログラムを作成してから、Javaプログラムをコールするジョブを作成します。 |
ジョブ・マネージャでカスタムJavaジョブの追加と構成を行うには:
第6.4項「ジョブ・マネージャで利用可能なジョブ・アクション・プロパティ」の説明に従ってカスタム・プロパティを設定します。
「新規ジョブの追加」ウィンドウで、プロパティを入力します。
たとえば、Javaプログラムのfilecopy.jarの場合、次の表に記載されている値を使用します。filecopy.jarプログラムの例を表示するには、第5.1.2項「例: エージェントのJavaプログラムの作成」を参照してください。
フィールド | 値または設定 |
---|---|
スクリプト・タイプ | Java |
クラス名 | sched.sched
第5.1.2項「例: エージェントのJavaプログラムの作成」で作成したJavaクラス。 |
クラス・パス | filecopy.jar
Javaクラスが含まれているJARファイル。 |
パラメータ | c:\tmp\report.pdf
注意: JavaHostプロセスの所有者は、このディレクトリ・ポイントで書込み権限を所有している必要があります。 |
「OK」をクリックします。
エージェントの条件付きリクエストが実行された後にJavaプログラムが実行されます。
Oracle BI Deliversでは新しいJavaジョブ・アクションをエージェントに追加できません。このリリースにアップグレードされた既存のもののみを使用できます。ただし、ジョブ・マネージャで新しいJavaジョブをジョブに追加することは可能です。詳細は、第3.2項「ジョブ・マネージャにおけるOracle BI Schedulerのジョブの追加」を参照してください。
この例では、エージェントの結果を別のディレクトリにコピーするJavaプログラムを作成します。例ではファイルをコピーするロジックのあるJavaクラスを作成します。
エージェントで使用するJavaプログラムを作成するには:
Javaエディタを使用してJavaプログラムを作成します。
schedという新しいJavaクラスを作成します。
次のコードをJavaエディタに貼り付けます。
package sched; import java.io.*; import java.lang.Thread; import com.siebel.analytics.scheduler.javahostrpccalls.SchedulerJavaExtension; import com.siebel.analytics.scheduler.javahostrpccalls.SchedulerJobException; import com.siebel.analytics.scheduler.javahostrpccalls.SchedulerJobInfo; public class sched implements SchedulerJavaExtension{ public void run(SchedulerJobInfo jobInfo) throws SchedulerJobException { System.out.println("JobID is:" + jobInfo.jobID()); System.out.println("Instance ID is:" + jobInfo.instanceID()); System.out.println("JobInfo to string is:" + jobInfo.toString()); try { // File outputFile = new File("D:\\JavaJob.txt"); File attachFile = jobInfo.getResultSetFile(); InputStream in = new FileInputStream(attachFile.getAbsolutePath()); OutputStream out = new FileOutputStream(jobInfo.parameter(0)); byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } in.close(); out.close(); } catch(Exception ex) { throw new SchedulerJobException(1, 1, ex.getMessage()); } } public void cancel() { } }
schedulerrpccalls.jarファイルをORACLE_HOME/bi/bifoundation/javahost/lib/schedulerディレクトリから各自のクラス・パスに追加します。
Javaクラスをエラーなしでコンパイルします。
コンパイル済出力をファイルにJar形式でアーカイブします。たとえば、filecopy.jarなどです。
ファイルの場所に注意して、エラーのないようにしてください。
この例では、第5.1.2項「例: エージェントのJavaプログラムの作成」で作成したJavaプログラムを構成し、Javaジョブがエージェントで機能するようにします。
エージェントで使用するJavaプログラムを構成するには:
第5.1.2項「例: エージェントのJavaプログラムの作成」で作成したfilecopy.jarファイルを次のディレクトリにコピーします。
ORACLE_HOME/bi/bifoundation/javahost/lib
次の変更をconfig.xmlというJavaHost構成ファイルに対して行います。
<Scheduler> <Enabled>True</Enabled>
<DefaultUserJarFilePath>D:\<ORACLE_HOME>\bi\bifoundation\javahost\lib</DefaultUserJarFilePath> </Scheduler>
JavaHost構成ファイルの使用方法の詳細は、『Oracle Fusion Middleware Oracle Business Intelligence Enterprise Editionシステム管理者ガイド』のOracle BI Presentation ServicesのJavahostサービスの使用に関する項を参照してください。
JavaHostファイルが正しく構成されていないと、エージェントとSchedulerが実行中でも、エージェントのログ・ファイルへの書込みが停止する場合があります。この場合、Windows タスク マネージャを使用してSchedulerを停止します。
その後、JavaHostサービスを再起動してください。
Oracle BI SchedulerはJavaHostサービスと統合して、カスタムJavaプログラムをサポートします。Oracle BI Schedulerには2つのJavaインタフェース(SchedulerJavaExtensionとSchedulerJobInfo)と1つのJavaクラス(SchedulerJobException)が用意されています。SchedulerJavaExtensionインタフェースを実装するクラスを用意します。
注意: JavaHostサービスの詳細は、『Oracle Fusion Middleware Oracle Business Intelligence Enterprise Editionシステム管理者ガイド』のOracle BI Presentation ServicesのJavahostサービスの使用に関する項を参照してください。 |
次の手順を使用して、Oracle BI SchedulerのJavaジョブを追加します。
注意: プロパティを構成する前に、コンパイル済Javaクラス・ファイルがJavaHostコンピュータに存在する必要があります。 |
Oracle BI SchedulerのJavaジョブを追加するには:
ジョブ・マネージャで、「ジョブ」メニューを選択し、「新規ジョブの追加」を選択して「新規ジョブの追加」ウィンドウを表示します。
ジョブ・マネージャを開く方法を確認するには、第3.1項「ジョブ・マネージャのオープン」を参照してください。
「スクリプト・タイプ」フィールドで「Java」を選択します。
カスタム・プロパティを指定します。これらの値を設定する方法の詳細は、第6.4項「ジョブ・マネージャで利用可能なジョブ・アクション・プロパティ」を参照してください。
クラス名がsample.Test、ファイル・パスがSampleのJavaジョブの値と設定の例を次に示します。追加のパスおよびパラーメータは含まれていません。
フィールド | 値または設定 |
---|---|
スクリプト・タイプ | Java |
クラス名 | sample.Test |
クラス・ファイル(JARファイル) | Sample |
「OK」をクリックします。
Oracle BI SchedulerのカスタムJavaプログラムの公開インタフェースとクラスは、com.siebel.analytics.scheduler.javahostrpccallsでパッケージ化されています。インタフェースが2つ、クラスが1つあり、これらについては次のトピックで説明します。
カスタム・コードでは次のインタフェースを実装する必要があります。
package com.siebel.analytics.scheduler.javahostrpccalls; public interface SchedulerJavaExtension { public void run(SchedulerJobInfo jobInfo) throws SchedulerJobException; public void cancel(); }
このインタフェースは、runとcancelのメソッドを備えています。次の表で、これらのメソッドについて説明します。
メソッド | 説明 |
---|---|
run | このメソッドはJavaHostにより起動されます。1つのSchedulerJobInfoオブジェクト(次に説明されています)が用意されており、これには、ユーザーID、ジョブID、インスタンスIDなどのインスタンス関連プロパティとパラメータが含まれています。SchedulerJobExceptionをスローするようにメソッドが宣言されます。これについても次に説明します。 |
cancel | ジョブ・インスタンスがまだ実行中にSchedulerが実行を取り消そうとすると、このメソッドが起動されます。cancelメソッドは別のスレッドにより同時にコールされます。そのため、実装では実行で共有されるデータを保護して、同期ブロックによりメソッドを取り消す必要があります。通常の実装では、cancelメソッド実装でcancelCalledブール値を設定し、run実装の長時間実行ループでこれをチェックします。 |
SchedulerJobInfoインタフェースは、現在実行されているジョブ・インスタンスに関する情報をカスタム・コードに提供します。
package com.siebel.analytics.scheduler.javahostrpccalls; import java.io.*; public interface SchedulerJobInfo { public final int kJavaJobInformation = 0; public final int kJavaJobWarning = 1; public final int kJavaJobError = 2; int jobID(); int instanceID(); int parameterCount(); String parameter(int index); boolean hasResultSet(); File getResultSetFile(); String userID(); int getExitCode(); void setExitCode(int exitCode); int getStatus(); void setStatus(int status); String getMessage(); void setMessage(String message); void appendMessage(String message); }
3つのpublic final整数値であるkJavaJobInformation、kJavaJobWarningおよびkJavaJobErrorは、状況に応じたステータスの設定に使用される推奨値です。次の表は、これらの状況を示しています。
メンバー | 説明 |
---|---|
public final int kJavaJobInformation = 0 | 情報メッセージが格納されます。 |
public final int kJavaJobWarning = 1 | 警告メッセージが格納されます。 |
public final int kJavaJobError = 2 | エラー・メッセージが格納されます。 |
次の表で、インタフェースで宣言されるすべてのメソッドについて説明します。
メソッド | 説明 |
---|---|
int jobID() | エージェントに関連付けられているジョブIDを戻します。 |
int instanceID() | エージェントに関連付けられているインスタンスIDを戻します。 |
int parameterCount() | エージェントに関連付けられているパラメータの数を戻します。 |
String parameter(int index) | エージェントの索引付きパラメータを戻します。(1) |
boolean hasResultSet() | このエージェントに結果セットがあるかどうかを指定します。 |
File getResultSetFile() | このエージェントの結果セットのファイルを戻します。(2) |
String userID() | エージェントを実行しているユーザーのIDを戻します。 |
int getExitCode() | エージェントの終了コードを戻します。 |
void setExitCode(int exitCode) | ユーザーはエージェントの終了コードを設定できます。 |
int getStatus() | エージェントのステータス・コードを戻します。 |
void setStatus(int status) | ユーザーはエージェントのステータス・コードを設定できます。 |
String getMessage() | エージェントに関連付けられているメッセージを戻します。 |
void setMessage(String message) | ユーザーはエージェントに関連付けられているメッセージを設定できます。既存のメッセージが置換されます。 |
void appendMessage(String message) | ユーザーは追加メッセージをエージェントに追加できます。 |
カスタム・コードが正常に完了できない場合、この例外クラスのインスタンスをスローします。
package com.siebel.analytics.scheduler.javahostrpccalls; public final class SchedulerJobException extends Exception { public SchedulerJobException(int exitCode, int status, String message) { m_exitCode = exitCode; m_status = status; m_message = message; } public int getExitCode() { return m_exitCode; } public int getStatus() { return m_status; } public String getMessage() { return m_message; } private int m_exitCode; private int m_status; private String m_message; }
SchedulerJavaExtensionインタフェースのrunメソッドは、SchedulerJobExceptionをスローするように宣言されています。次の表で、3つのメンバーについて説明します。
メンバー | 説明 |
---|---|
int m_exitCode | フレームワークによりこの終了コードがエージェントに割り当てられます。 |
int m_status | フレームワークによりこのステータス・コードがエージェントに割り当てられます。 |
String m_message | フレームワークによりこのメッセージがエージェントに割り当てられます。 |
次の例では、以前に説明したインタフェースとクラスを使用して、カスタムJavaアクションを作成する方法について示しています。詳細は、第5.1項「Oracle BI SchedulerのJavaジョブの使用方法」を参照してください。
この例には長時間実行コードがないので、cancelメソッドでは処理が行われないのが妥当です。
コンパイルされたクラスが実行されると、エージェントを実行したユーザーのID、エージェントのジョブID、エージェントのインスタンスIDおよびすべての可能なパラメータを出力ファイルに収集します。
package sample; import java.io.*; import java.lang.Thread; import com.siebel.analytics.scheduler.javahostrpccalls.SchedulerJavaExtension; import com.siebel.analytics.scheduler.javahostrpccalls.SchedulerJobException; import com.siebel.analytics.scheduler.javahostrpccalls.SchedulerJobInfo; /** * * @author */public class SimpleTest implements SchedulerJavaExtension { public void run(SchedulerJobInfo jobInfo) throws SchedulerJobException { System.out.println("JobID is:" + jobInfo.jobID()); System.out.println("Instance ID is:" + jobInfo.instanceID()); System.out.println("JobInfo to string is:" + jobInfo.toString()); try { File outputFile = new File("D:\\temp\\JavaJob.txt"); FileWriter out = new FileWriter(outputFile); out.write("User ID:\t\t" + jobInfo.userID() + "\r\n"); out.write("Job ID:\t\t" + jobInfo.jobID() + "\r\n"); out.write("Instance ID:\t\t" + jobInfo.instanceID() + "\r\n"); out.write("Parameter Count:\t\t" + jobInfo.parameterCount() + "\r\n"); for(int i = 0; i < jobInfo.parameterCount(); ++i) { out.write("\tParameter "); out.write(new Integer(i).toString()); out.write(":\t" + jobInfo.parameter(i) + "\r\n"); } out.close(); } catch(Exception ex) { throw new SchedulerJobException(1, 1, ex.getMessage()); } } public void cancel() { } }