Oracle® Fusion Middleware Oracle Business Intelligence Publisher開発者ガイド 11gリリース1(11.1.1) B66710-03 |
|
前へ |
次へ |
この章では、HTTPサーブレットを使用してAfter-Reportトリガーを設定する方法について説明します。
内容は次のとおりです。
BI Publisherを使用すれば、After-ReportトリガーとしてAfter-Reportの生成を実行するHTTP通知を設定できます。これにより、BI Publisherを他のOracleアプリケーションやサード・パーティ・アプリケーション(BPELプロセス、コンテンツ管理アプリケーション、その他のワークフロー・アプリケーションなど)と統合できます。
BI Publisherは、データ・モデル定義内のイベント・トリガー(Before DataトリガーおよびAfter Dataトリガー)をサポートします。それを使用して、データ生成時にプログラムをトリガーできます。HTTP通知はレポート生成後にトリガーされます。
BI Publisherでレポートが生成されるとすぐに通知が実行されることに注意してください。現時点では、レポートの生成からサーブレットへのHTTP通知の間に、リスナーまたはプロセスをコール・バックしたり導入したりする機能はありません。
レポートに対してAfter-Reportトリガーを設定するには、次のタスクが必要です。
この章で説明されているように、サーブレットまたはサード・パーティ・アプリケーションを作成します。
BI Publisherの「管理」ページでサーブレットURLをHTTP配信サーバーとして登録します。第10.2.1項「HTTPサーブレットの登録」を参照してください。
サーブレットはセキュリティ回避に使用できる必要があるため、サーブレットのマッピングはweb.xmlで行う必要があります(WEB-INFフォルダ下)。
レポートのスケジュールを作成するには、HTTP通知を選択します。
レポートの生成が完了すると、BI PublisherでHTTP通知が後処理としてコールされ、次の追加パラメータとともに(HTTPサーバーとして登録した)URLが実行されます。
jobid
report_url
status
statusの値は、成功を表す「S」、または失敗を表す「F」になります。
その後、リモート・アプリケーションは、BI PublisherのAPIやWebサービスを使用してこれらのパラメータにアクセスし、レポート出力やXMLデータなどのジョブの詳細にアクセスできます。サンプル・コードを次に示します。
例10-1 After-Reportトリガーの設定のサンプル・コード
String id = request.getParameter("jobid"); String report_url = request.getParameter("report_url"); String status = request.getParameter("status"); try { Scheduler sch =new SchedulerImpl(); JobHistoryInfo[] jobs= sch.getJobHistoryInfo(id); for (int i = 0; i<jobs.length; i++){ JobHistoryInfo outinfo = jobs[i]; FileOutputStream fos = new FileOutputStream(targetDir+id+".pdf"); byte[] buf = new byte[256]; int read = 0; InputStream in = outinfo.getDocumentOutput(); while ((read =in.read(buf)) > 0) { fos.write(buf, 0, read); } in.close(); fos.close(); } } catch (Exception e) { Logger.log(e); }
HTTPサーブレットが同じサーバー上のBI Publisherアプリケーション内で実行中の場合、それをweb.xmlで登録する必要があります(WEB-INFフォルダ内に配置)。次のようにweb.xmlファイルを更新します。
<servlet> <servlet-name>HttpNotificationTest</servlet-name> <servlet-class>oracle.xdo.service.scheduling.HttpNotificationTest</servlet-class> </servlet> <servlet-mapping> <servlet-name>HttpNotificationTest</servlet-name> <url-pattern>/services/HttpNotificationTest</url-pattern> </servlet-mapping>
または、HTTPサーブレットのかわりにJSPページを作成して、このHTTP通知を処理することも可能です。JSPでは、web.xmlを変更する必要はありません。
次に、HTTP通知として呼び出されるサンプルのHTTPサーブレットを示します。この例では、サーブレットがBI Publisherアプリケーションと同じサーバー上にデプロイされます。サーブレットをリモート・サーバー上にデプロイする場合は、BI PublisherのWebサービスAPIを使用してレポートの詳細にアクセスします。BI PublisherのWebサービスAPIの詳細は、Oracle Fusion Middleware Oracle Business Intelligence Publisher 11g Java APIリファレンスを参照してください。
このサンプルでは、サーブレットでレポート出力を取得するために、HTTPリクエストから提供される情報をBI Publisher Webサービスの入力として使用します。このレポート出力は、後で承認ワークフローに挿入するために使用される場合があります。
例10-2 サンプル・プログラム・コード
package oracle.xdo.service.scheduling; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import oracle.xdo.common.log.Logger; import oracle.xdo.server.JobHistoryInfo; import oracle.xdo.server.Scheduler; import oracle.xdo.server.impl.SchedulerImpl; public class HttpNotificationTest extends HttpServlet { public String targetDir = "c://scratch/example/apphome/xmlpserver/xmlpserver/output/"; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String id= request.getParameter("jobid"); String report_url = request.getParameter("report_url"); String status = request.getParameter("status"); try { Scheduler sch =new SchedulerImpl(); JobHistoryInfo[] jobs= sch.getJobHistoryInfo(id); for (int i = 0; i<jobs.length; i++){ JobHistoryInfo outinfo = jobs[i]; FileOutputStream fos = new FileOutputStream(targetDir+id+"."+getFileExtension(outinfo.getDocumentDataContentType())); byte[] buf = new byte[256]; int read = 0; InputStream in = outinfo.getDocumentOutput(); while ((read =in.read(buf)) > 0) { fos.write(buf, 0, read); } in.close(); fos.close(); } } catch (Exception e) { Logger.log(e); } } public static String getFileExtension(String contentType) { String ext="pdf"; if (contentType == "application/pdf") ext="pdf" ; else if (contentType == "text/html; charset=UTF-8") ext="html"; return ext; }