ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Business Intelligence Enterprise Editionジョブ・スケジューリング・ガイド
11gリリース1(11.1.1)
B66707-02
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

5 BI SchedulerのJavaジョブのプログラミング

この章では、Oracle BI Schedulerを使用して、Oracle Business Intelligenceの機能を拡張するJavaジョブと呼ばれるJavaプログラムをスケジュールする方法について説明します。Javaジョブは、ジョブ・マネージャでスタンドアロンのSchedulerジョブ(Windows)にするか、エージェントの末尾に追加されてリリース10gからアップグレードされたOracle BI Deliversの既存のJavaアクション(WindowsまたはUNIX)にできます。

リリース10gからアップグレードされた既存のJavaアクションは実行できますが、リリース11gでは作成できません。かわりに、このリリースで利用可能なEJBベースのJavaアクションを使用する必要があります。アクションの詳細は、『Oracle Fusion Middleware Oracle Business Intelligence Enterprise Editionユーザーズ・ガイド』を参照してください。

この章では、Oracle BI SchedulerのJavaジョブをプログラミングする方法について説明します。内容は次のとおりです。

5.1 Oracle BI SchedulerのJavaジョブの使用方法

Javaジョブは、Oracle BI SchedulerのかわりにJavaHostプロセスで実行されるJavaプログラムです。JavaジョブはJava EJBアクションとは異なります。1つのクラスでエントリ・ポイントが定義されているJavaジョブがJARファイルでデプロイされます。このクラスはSchedulerJavaExtensionインタフェースを実装する必要があります。ジョブのコンテキストは、入力SchedulerJobInfoパラメータにより提供されます。

この項の内容は次のとおりです。

5.1.1 ジョブ・マネージャにおけるカスタムJavaジョブの追加と構成

ジョブ・マネージャの「ジョブの変更」とジョブの追加のダイアログ・ボックスでカスタムJavaジョブの追加と構成を行います。第3.2項「ジョブ・マネージャにおけるOracle BI Schedulerのジョブの追加」第3.3項「ジョブ・マネージャにおけるOracle BI Schedulerのジョブの変更」を参照してください。


注意:

ジョブをジョブ・マネージャで作成する前に、Oracle BI Schedulerのサーバー・コンピュータにJavaプログラムが存在する必要があります。Javaプログラムを作成してから、Javaプログラムをコールするジョブを作成します。


ジョブ・マネージャでカスタムJavaジョブの追加と構成を行うには:

  1. 第6.4項「ジョブ・マネージャで利用可能なジョブ・アクション・プロパティ」の説明に従ってカスタム・プロパティを設定します。

  2. 「新規ジョブの追加」ウィンドウで、プロパティを入力します。

    たとえば、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プロセスの所有者は、このディレクトリ・ポイントで書込み権限を所有している必要があります。


  3. 「OK」をクリックします。

    エージェントの条件付きリクエストが実行された後にJavaプログラムが実行されます。

    Oracle BI Deliversでは新しいJavaジョブ・アクションをエージェントに追加できません。このリリースにアップグレードされた既存のもののみを使用できます。ただし、ジョブ・マネージャで新しいJavaジョブをジョブに追加することは可能です。詳細は、第3.2項「ジョブ・マネージャにおけるOracle BI Schedulerのジョブの追加」を参照してください。

5.1.2 例: エージェントのJavaプログラムの作成

この例では、エージェントの結果を別のディレクトリにコピーするJavaプログラムを作成します。例ではファイルをコピーするロジックのあるJavaクラスを作成します。

エージェントで使用するJavaプログラムを作成するには:

  1. Javaエディタを使用してJavaプログラムを作成します。

    1. schedという新しいJavaクラスを作成します。

    2. 次のコードを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()
          {
          }
          }
      
    3. schedulerrpccalls.jarファイルを\MW_HOME\ORACLE_HOME\bifoundation\javahost\lib\schedulerディレクトリから各自のクラス・パスに追加します。

    4. Javaクラスをエラーなしでコンパイルします。

    5. コンパイル済出力をファイルにJar形式でアーカイブします。たとえば、filecopy.jarなどです。

    6. ファイルの場所に注意して、エラーのないようにしてください。

5.1.3 例: Javaプログラムの構成

この例では、第5.1.2項「例: エージェントのJavaプログラムの作成」で作成したJavaプログラムを構成し、Javaジョブがエージェントで機能するようにします。

エージェントで使用するJavaプログラムを構成するには:

  1. 第5.1.2項「例: エージェントのJavaプログラムの作成」で作成したfilecopy.jarファイルを次のディレクトリにコピーします。

    ORACLE_HOME\bifoundation\javahost\lib

  2. 次の変更をconfig.xmlというJavaHost構成ファイルに対して行います。

    <Scheduler>
      <Enabled>True</Enabled>       
    <DefaultUserJarFilePath>D:\<ORACLE_HOME>\bifoundation\javahost\lib</DefaultUserJarFilePath> </Scheduler>

    JavaHost構成ファイルの使用方法の詳細は、『Oracle Fusion Middleware Oracle Business Intelligence Enterprise Editionシステム管理者ガイド』のOracle BI Presentation ServicesのJavahostサービスの使用に関する項を参照してください。

    JavaHostファイルが正しく構成されていないと、エージェントとSchedulerが実行中でも、エージェントのログ・ファイルへの書込みが停止する場合があります。この場合、Windows タスク マネージャを使用してSchedulerを停止します。

  3. その後、JavaHostサービスを再起動してください。

5.2 Oracle BI SchedulerのJavaジョブ

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サービスの使用に関する項を参照してください。


5.3 Oracle BI SchedulerのJavaジョブの追加

次の手順を使用して、Oracle BI SchedulerのJavaジョブを追加します。


注意:

プロパティを構成する前に、コンパイル済Javaクラス・ファイルがJavaHostコンピュータに存在する必要があります。


Oracle BI SchedulerのJavaジョブを追加するには:

  1. ジョブ・マネージャにアクセスし、「ジョブ」メニューで、「新規ジョブの追加」を選択します。

    「新規ジョブの追加」ウィンドウが表示されます。

  2. 「スクリプト・タイプ」フィールドで「Java」を選択します。

  3. カスタム・プロパティを指定します。これらの値を設定する方法の詳細は、第6.4項「ジョブ・マネージャで利用可能なジョブ・アクション・プロパティ」を参照してください。

    クラス名がsample.Test、ファイル・パスがSampleのJavaジョブの値と設定の例を次に示します。追加のパスおよびパラーメータは含まれていません。

    フィールド 値または設定

    スクリプト・タイプ

    Java

    クラス名

    sample.Test

    クラス・ファイル(JARファイル)

    Sample


  4. 「OK」をクリックします。

5.4 Oracle BI SchedulerのカスタムJavaプログラム・パッケージ

Oracle BI SchedulerのカスタムJavaプログラムの公開インタフェースとクラスは、com.siebel.analytics.scheduler.javahostrpccallsでパッケージ化されています。インタフェースが2つ、クラスが1つあり、これらについては次のトピックで説明します。

5.5 SchedulerJavaExtensionインタフェース

カスタム・コードでは次のインタフェースを実装する必要があります。

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実装の長時間実行ループでこれをチェックします。


5.6 SchedulerJobInfoインタフェース

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整数値であるkJavaJobInformationkJavaJobWarningおよび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)

ユーザーは追加メッセージをエージェントに追加できます。


5.7 SchedulerJobExceptionクラス

カスタム・コードが正常に完了できない場合、この例外クラスのインスタンスをスローします。

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

フレームワークによりこのメッセージがエージェントに割り当てられます。


5.8 Oracle BI SchedulerのJava拡張例

次の例では、以前に説明したインタフェースとクラスを使用して、カスタム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()
{
}
}