[Database] Oracle Database 12c By Example – SQL Developer and Multitenant

原文はこちら。
http://www.thatjeffsmith.com/archive/2013/06/oracle-database-12c-by-example-sql-developer-and-multitenant/

既にお耳に入っているかと思いますが、Oracle Database 12cがリリースされました。バイナリやドキュメントに加え、いくつかのOracle By Example(OBE)のコンテンツもご利用いただけるようになっています。製品ページのリンクからたどることができます。
Oracle SQL Developer
http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html
[訳注]
上記ページは一部のみ掲載されています。Oracle By Exampleの検索ページで、[Product Family]にDatabase、[Product]にDatabase 12cを指定して検索すればいろいろ出てきます。
Oracle By Example
https://apex.oracle.com/pls/apex/f?p=44785:2:0::NO:RIR::


これらの、実質的に公開された記録を誰が見つけたかご存知ですか?ニューオーリンズのODTUG KScope13コンファレンスで取り上げ、プレゼンテーションした、ある進取の気性に富んだ非凡なDBAです。彼はホテルの無線LAN経由で新しいソフトウェアをダウンロード、インストールして、新しいマルチテナントデータベースを作成し、いくつかのOBEを見た後、彼のセッション「SQL Developer for DBAs」でライブデモをするのがよさそう、と思ったのです。

おかしいですよね?
まぁ、彼はやりました。その場で見てました。
チョーかっこよかったですよ。

@leight0nn@oraclenered とのODTUGのインタビューで、彼の言葉で自身のお話をするところを聴くことができます。
めまいがしてじっと動画を見ていられない方に、プレビューをお伝えしましょう。Oracle Database 12cに接続しながら、Oracle SQL Developer 3.2.20.09を使ってわずか数クリックで、無事にPluggable Database(PDB)を1分以内で複製しました。

[Database] 12c - Utl_Call_Stack...

原文はこちら。
http://tkyte.blogspot.jp/2013/06/12c-utlcallstack.html

来る数ヶ月にわたって、Oracle Database 12cの小さいけれどクールな新機能について執筆することになるでしょう。おそらくOracle.comのフロントページにはならないと思います。新しいパッケージ、UTL_CALL_STACKについて始めましょう。
Oracle® Database PL/SQL Packages and Types Reference 12c Release 1 (12.1)
UTL_CALL_STACK
http://docs.oracle.com/cd/E16655_01/appdev.121/e17602/u_call_stack.htm#ARPLS74078
以前、開発者は次の3個のファンクションにアクセスして「いったいコードのどこにいるんだ?」と実行中のコードの場所を把握していました。
さてこのルーティンは確かに有用なのですが、少々制限された利用でした。その理由を知るため、format_call_stackルーチンを見てみましょう。現在のコールスタックを出力するというだけのプロシージャを用意しました。
ops$tkyte%ORA12CR1> create or replace
  2  procedure Print_Call_Stack
  3  is
  4  begin
  5    DBMS_Output.Put_Line(DBMS_Utility.Format_Call_Stack());
  6  end;
  7  /
Procedure created.
さて、ネストされたファンクションと重複したファンクション名を持つパッケージがある場合…
ops$tkyte%ORA12CR1> create or replace
  2  package body Pkg is
  3    procedure p
  4    is
  5      procedure q
  6      is
  7        procedure r
  8        is
  9          procedure p is
 10          begin
 11            Print_Call_Stack();
 12            raise program_error;
 13          end p;
 14        begin
 15          p();
 16        end r;
 17      begin
 18        r();
 19      end q;
 20    begin
 21      q();
 22    end p;
 23  end Pkg;
 24  /

Package body created.
PKG.Pプロシージャを実行すると、結果は以下のようになるでしょう。
ops$tkyte%ORA12CR1> exec pkg.p
----- PL/SQL Call Stack -----
object line object
handle number name
0x6e891528 4 procedure OPS$TKYTE.PRINT_CALL_STACK
0x6ec4a7c0 10 package body OPS$TKYTE.PKG
0x6ec4a7c0 14 package body OPS$TKYTE.PKG
0x6ec4a7c0 17 package body OPS$TKYTE.PKG
0x6ec4a7c0 20 package body OPS$TKYTE.PKG
0x76439070 1 anonymous block

BEGIN pkg.p; END;


*
ERROR at line 1:
ORA-06501: PL/SQL: program error
ORA-06512: at "OPS$TKYTE.PKG", line 11
ORA-06512: at "OPS$TKYTE.PKG", line 14
ORA-06512: at "OPS$TKYTE.PKG", line 17
ORA-06512: at "OPS$TKYTE.PKG", line 20
ORA-06512: at line 1
赤の部分はformat_call_stackからの出力で、黒の部分はクライアントアプリケーションからのエラーメッセージです(format_error_backtraceというAPIを呼び出しても得られるでしょう)。おわかりのように、有用な情報が含まれていますが、利用するためには構文解析が必要で、思っているよりもトリッキーな可能性があります。これらの文字列の形式は固定ではなく、長年にわたって変化してきました(私は"who_am_i"、 "who_called_me"ファンクションを書きましたが、これらの文字列を構文解析することによって実現しました。信じて下さい、時間と共に変化するのです!)。

12cからは、コールスタックや一連のAPIコールへのアクセスが構造化され、この構造を問い合わせるようになりました。以下のようにprint_call_stackファンクションを書き換えてみましょう。
ops$tkyte%ORA12CR1> create or replace
 2  procedure Print_Call_Stack
  3  as
  4    Depth pls_integer := UTL_Call_Stack.Dynamic_Depth();
  5  
  6    procedure headers
  7    is
  8    begin
  9        dbms_output.put_line( 'Lexical   Depth   Line    Name' );
 10        dbms_output.put_line( 'Depth             Number      ' );
 11        dbms_output.put_line( '-------   -----   ----    ----' );
 12    end headers;
 13    procedure print
 14    is
 15    begin
 16        headers;
 17        for j in reverse 1..Depth loop
 18          DBMS_Output.Put_Line(
 19            rpad( utl_call_stack.lexical_depth(j), 10 ) ||
 20                    rpad( j, 7) ||
 21            rpad( To_Char(UTL_Call_Stack.Unit_Line(j), '99'), 9 ) ||
 22            UTL_Call_Stack.Concatenate_Subprogram
 23                       (UTL_Call_Stack.Subprogram(j)));
 24        end loop;
 25    end;
 26  begin
 27    print;
 28  end;
 29  /
ここで、コードのどの「位置(深さ)」にいるのか(utl_call_stack.dynamic_depth)がわかるので、ループを使ってスタックを上っていくことができます。lexical_depthと、実行していたユニット内の行番号に加えて、ユニット名も出力します。そして、任意のユニット名だけではなく、完全修飾されたユニット名で、パッケージ内のサブプログラム名を辿ることができます。しかし、それだけではなく、サブプログラム名の中のサブプログラム名の中のサブプログラム名も辿ることができます。例えば - 再びPKG.Pプロシージャを実行すると、その結果は以下のようになります。
ops$tkyte%ORA12CR1> exec pkg.p

Lexical Depth Line Name
Depth Number
------- ----- ---- ----
1 6 20 PKG.P
2 5 17 PKG.P.Q
3 4 14 PKG.P.Q.R
4 3 10 PKG.P.Q.R.P
0 2 26 PRINT_CALL_STACK
1 1 17 PRINT_CALL_STACK.PRINT


BEGIN pkg.p; END;

*
ERROR at line 1:
ORA-06501: PL/SQL: program error
ORA-06512: at "OPS$TKYTE.PKG", line 11
ORA-06512: at "OPS$TKYTE.PKG", line 14
ORA-06512: at "OPS$TKYTE.PKG", line 17
ORA-06512: at "OPS$TKYTE.PKG", line 20
ORA-06512: at line 1
今度は、以前format_call_stackを使って出力した行番号とパッケージ名よりも多くの情報を得ています。行番号とパッケージ(ユニット)名(サブプログラムの名前)を得るだけでなく、PがQを呼び、QがRを呼び、RがPを呼ぶというようなネストされたサブプログラムを把握することができます。また、我々は字句の深さを持つ、「本物の」呼び出しレベルを確認できること、パッケージからprint_call_stackにステップアウトし、順番に別のネストされたサブプログラムを呼び出していることが確認できることにご注目下さい。

この新しいパッケージはみなさんのエラーロギングパッケージへのすばらしい追加機能になるでしょう。もちろん、所有者名、コード実行時に効力のあるエディションなどを入手するためのその他のファンクションも含まれています。詳細情報はPL/SQL Packages and Types ReferenceのUTL_CALL_STACKの項をご覧下さい。
Oracle® Database PL/SQL Packages and Types Reference 12c Release 1 (12.1)
UTL_CALL_STACK
http://docs.oracle.com/cd/E16655_01/appdev.121/e17602/u_call_stack.htm#ARPLS74078

[EM] Ops Center 12.1.4 Released

原文はこちら。
https://blogs.oracle.com/opscenter/entry/ops_center_12_1_4

Oracle Enterprise Manager 12c Ops Centerの最新版、12.1.4.0.0がリリースされました。新機能がいくつかありますが、最大のものは、複数のAutomated Installerのインストールサービスです。これにより、一つではなく、任意のバージョンのOracle Solaris 11をプロビジョニングすることができます。また、複数ファイルのVMテンプレートをサポートし、vServerのためのネットワーク構成のサポートを強化しています。新機能に関する詳細情報は、What's Newドキュメントをご覧下さい。
Oracle® Enterprise Manager Ops Center What's New In this Release?
12c Release 1 (12.1.4.0.0)
http://docs.oracle.com/cd/E27363_01/doc.121/e35789/toc.htm
既にOps Centerをお使いであれば、12.1.4をダウンロードしてUIでアップグレードできます。OTN(試使用に限ります)もしくはe-deliveryから入手して下さい。管理者ガイド(Admin Guide)のアップグレードの章でアップグレードの方法を説明しています。
Enterprise Manager Ops Center 12c - Ops Center Focus Area
http://www.oracle.com/technetwork/oem/ops-center/index.html
Oracle Software Delivery Cloud
http://edelivery.oracle.com/
Oracle® Enterprise Manager Ops Center Administration Guide 12c Release 1 (12.1.4.0.0)
Upgrading
http://docs.oracle.com/cd/E27363_01/doc.121/e25143/upgrading.htm#CEGCABAF
Oracle® Enterprise Manager Ops Center Administration Guide 12c Release 1 (12.1.4.0.0)
http://docs.oracle.com/cd/E27363_01/doc.121/e25143/toc.htm

[Java] Servlet 3.1, Expression Language 3.0, Bean Validation 1.1, Admin Console Replay: Java EE 7 Launch Webinar Technical Breakouts on YouTube

原文はこちら。
https://blogs.oracle.com/theaquarium/entry/servlet_3_1_expression_language

以前お伝えしたように、Java EE 7 Launch Webcastのオンデマンド視聴ができるようになっています。Strategic/Technical Keynoteとその他のTechnical Breakoutセッションをご覧頂けます。
View the On-Demand Replay of Java EE 7 Launch Event
https://blogs.oracle.com/theaquarium/entry/view_on_demand_replay_of
http://orablogs-jp.blogspot.jp/2013/06/view-on-demand-replay-of-java-ee-7.html

JSON 1.0, EJB 3.2, Batch 1.0 Replay: Java EE 7 Launch Webinar Technical Breakouts on YouTube
https://blogs.oracle.com/theaquarium/entry/json_1_0_ejb_3
http://orablogs-jp.blogspot.jp/2013/06/json-10-ejb-32-batch-10-replay-java-ee.html

WebSocket 1.0, CDI 1.1, Concurrency 1.0 Replay: Java EE 7 Launch Webinar Technical Breakouts on YouTube
https://blogs.oracle.com/theaquarium/entry/websocket_1_0_cdi_1
http://orablogs-jp.blogspot.jp/2013/06/websocket-10-cdi-11-concurrency-10.html

JAX-RS 2.0, JTA 1.1, JMS 2.0 Replay: Java EE 7 Launch Webinar Technical Breakouts on YouTube
https://blogs.oracle.com/theaquarium/entry/jax_rs_2_0_jta
http://orablogs-jp.blogspot.jp/2013/06/jax-rs-20-jta-11-jms-20-replay-java-ee.html

JSF 2.2, Interceptors 1.2, and JPA 2.1 Replay: Java EE 7 Launch Webinar Technical Breakouts on YouTube
https://blogs.oracle.com/theaquarium/entry/jsf_2_2_interceptors_1
http://orablogs-jp.blogspot.jp/2013/06/jsf-22-interceptors-12-and-jpa-21.html

Technical Breakoutセッションの最後のセットをお届けします。YouTubeチャネルのGlassFishVideosにTechnical Breakoutセッションをアップしています。今回はServlet 3.1、Expression Language 3.0、Bean Validation 1.1、そしてAdmin Consoleの4本です。
Sparky GlassFish
GlassFishVideos YouTube channel
Servlet 3.1


Expression Language 3.0


Bean Validation 1.1


Admin Console

統合されたプレイリストでまとめてお楽しみ下さい。

あと、Java EE 7 SDKのダウンロードと付属する数多くのサンプルを試すことをお忘れなく!
Java EE 7 SDK
http://oracle.com/javaee

[Java] An Overview of Batch Processing in Java EE 7

原文はこちら。
https://blogs.oracle.com/java/entry/an_overview_of_batch_processing

OracleのシニアソフトウェアエンジニアであるMahesh Kannanが寄稿した「An Overview of Batch Processing in Java EE 7.0」という記事がOTNのJavaページに掲載されています。この記事はJava EE 7のJSR 352が提供する新しいバッチ処理機能について説明するものです。Kannanは次のように説明しています。
“Batch processing is used in many industries for tasks ranging from payroll processing; statement generation; end-of-day jobs such as interest calculation and ETL (extract, load, and transform) in a data warehouse; and many more. Typically, batch processing is bulk-oriented, non-interactive, and long running—and might be data- or computation-intensive. Batch jobs can be run on schedule or initiated on demand. Also, since batch jobs are typically long-running jobs, check-pointing and restarting are common features found in batch jobs.”
「バッチ処理は、給与処理、取引明細書の作成、1日の終わりの利息計算とデータウェアハウスのETL(抽出、ロード、変換)などなど、いたるところで使われています。通常、バッチ処理はバルク指向、対話のない処理で、長時間の処理であり、ともするとデータや計算集約的なものです。バッチジョブはスケジュール実行か、オンデマンドで開始されます。また、バッチジョブは通常長時間実行されるジョブですので、チェックポイントや再起動がバッチジョブにある共通の機能です。」
JSR 352ではバッチアプリケーションのプログラミングモデルと、バッチジョブの実行および管理のためのランタイムを定義しています。この記事では、機能のハイライト、API、ジョブスケジューリング言語の構造を取り扱い、シンプルな給与処理アプリケーションを使用して、JSR352の主要な機能の一部を説明します。また開発者がGlassFish Server Open Source Edition 4.0を使ってバッチアプリケーションを実行する方法についても説明しています。

Kannanは次のように記事をまとめています。
“In this article, we saw how to write, package, and run simple batch applications that use chunk-style steps. We also saw how the checkpoint feature of the batch runtime allows for the easy restart of failed batch jobs. Yet, we have barely scratched the surface of JSR 352. With the full set of Java EE components and features at your disposal, including servlets, EJB beans, CDI beans, EJB automatic timers, and so on, feature-rich batch applications can be written fairly easily.”
「この記事では、チャンク形式の手順を使用して簡単なバッチアプリケーションを作成し、パッケージにして、実行する方法を説明しました。また、バッチランタイムのチェックポイント機能を使って、失敗したバッチジョブを簡単に再起動できることを説明しました。しかし、我々はJSR 352の表面をちょっとかじっただけに過ぎません。サーブレットや、EJB Beans、CDI Beans、EJB自動タイマーなどを含む、Java EEのコンポーネントや機能のフルセットを使って、機能豊富なバッチアプリケーションをかなり容易に書くことができます。」
記事は以下のリンクからどうぞ。
An Overview of Batch Processing in Java EE 7.0
http://www.oracle.com/technetwork/articles/java/batch-1965499.html

[Solaris, Database] Oracle Database 12c and Oracle Solaris 11 DTrace

原文はこちら。
https://blogs.oracle.com/solaris/entry/database_12c_and_solaris_dtrace

お耳に入っているように、Oracle Database 12c(Oracle Solaris、Oracle Linux向け)がリリースされました。
Oracle Database Software Downloads
http://www.oracle.com/technetwork/database/enterprise-edition/downloads/
何より、このタイミングはOracle DatabaseとOracle Solarisのエンジニアリングチームが協同作業してきたクールなものを共有する絶好の機会ですので、一つご紹介します。以下の動画で、Oracle Solaris 11で、DTraceがOracle DatabaseのV$ビューと統合され、ストレージ装置からOracle Solarisカーネルを通じ、Oracle Database 12cまでのEnd-to-EndでデータベースのトランザクションI/Oの状態を監視できる様子をJohn Haslamが説明しています。

About Dynamic Performance Views
http://docs.oracle.com/cd/E16655_01/server.121/e17615/dynviews_1001.htm



このEnd-to-Endのビューで、簡単にI/Oの異常値(例えば完了までに以上に時間がかかっているトランザクション)を特定でき、この包括的なデータを使うと、これまでデバッグがかなり困難だったストレージシステムの問題を識別、軽減することができます。

これは登場して10年になろうとするDTraceの能力のすばらしい例です。
Tutorial: DTrace by Example
http://www.oracle.com/technetwork/server-storage/solaris/dtrace-tutorial-142317.html 
この動画にはDTraceのすごさを説明するだけでなく、DTrace/Oracle Database 12cの相乗効果も説明する素敵なサンプルがあります。
もちろんほかにもあります。Rick Ramseyが、OSがデータベースに悲鳴を上げさせる方法をまとめてくれています。
How Oracle Solaris Makes the Database Scream
https://blogs.oracle.com/OTNGarage/entry/how_the_os_makes_the
そして、Oracle Database/Oracle Solarisの相乗効果に関して深掘りしたページもOTNにありますよっと。
Oracle Database Runs Best on Oracle Solaris
http://www.oracle.com/technetwork/server-storage/solaris11/technologies/oracledatabase-1897821.html

[Java] Java Virtual Developer Day Session Videos Available

原文はこちら。
https://blogs.oracle.com/java/entry/java_virtual_developer_day_session

  • Lambdaをバイトコードレベルで処理するには?
  • Javaコードでアセンブリコードを置き換えるとどれぐらい性能がよくなる?
  • フラットファイル/CSV/XMLファイルを送信してバッチ処理できる?
  • Java EEアプリケーションで、@EJBアノテーションを使いREST POJO内のEJB Beanを注入(Injection)できる?
  • JavaFX UIコントロールはどこにあるの?
OTNのVirtual Developer Dayでは、Javaのエキスパートがこうした質問に答えました。セッションはオンデマンド視聴できるようになっています(視聴には登録が必要です)。
これは期間限定で、セッションは次の2週間、無料でご覧頂けます。
Virtual Developer Day : Java
https://oracle.6connex.com/portal/java2013/login/?langR=en_US&mcc=OTNBLOG
この3個のトラックのセッションをご覧頂けます。
VDD
Java SE 8 Track
Java SE 8で予定されている機能(Lambda式、インターフェースの拡張メソッド、新しいDateやTime APIなど)とJavaFXを使ってベーシックなアプリケーションを作る方法を学びましょう。

Java EE Track
Java EE 7の新機能をチェックしましょう。JSONやWebSocket、バッチ、Concurrency、JAX-RS 2、JMS 2に関するプレゼンテーションやデモをご覧下さい。

Java Embedded Track
Raspberry Pi、Keilボード、ARMのアーキテクチャ、そしてJava Embeddedで動作させる方法についてご紹介します。

Javaをご存知の方も、本当の意味で知って頂けると思います。是非OTN Virtual Developer Dayのセッションをチェックして下さい。

[Database] New White Paper about Upgrade to Oracle Database 12c

原文はこちら。
https://blogs.oracle.com/UPGRADE/entry/new_white_paper_about_i

Oracle Database 12cのリリースにあわせ、多くの新しい資料がご利用いただけるようになっていきますが、我々が執筆したホワイトペーパーもご利用いただけるようになりました。
Upgrading to Oracle Database 12c
http://www.oracle.com/technetwork/database/upgrade/upgrading-oracle-database-wp-12c-1896123.pdf
このホワイトペーパーではデータベースをOracle Database 12cにアップグレードしたり移行したりする上で利用可能な方法を概説しています。要件に最適な方法を選択する上で考慮すべき様々なユースケースや重要な要素を知っていただければと思います。
そして、新しいOracle 12cのドキュメントをご覧になりたい方は、以下のリンクからどうぞ。
Oracle Database 12c Documentation Library
http://www.oracle.com/technetwork/database/enterprise-edition/documentation/index.html

[Database] Oracle Database 12c Launch Webcast

Oracle Database 12c (12.1.0.1)がリリースされましたが、そのLaunch webcastが以下の予定で開催されます。
日本時間ではちょっとつらい時間帯ですが、ご興味ある方は是非登録の上視聴いただければと思います。

  • 日時
    • [PDT] 2013年7月10日9時から
    • [EDT] 2013年7月10日12時から
    • [JST] 2013年7月11日1時から
  • 登壇者
    • Mark Hurd
    • Andy Mendelsohn
    • Tom Kyte など

登録は以下のページからどうぞ。
Launch Webcast: Plug into the Cloud with Oracle Database 12c
https://event.on24.com/eventRegistration/EventLobbyServlet?target=registration.jsp&eventid=617926&sessionid=1&key=8D5918DABF87924314A8E84FA29A9178&partnerref=DB_db12claunch_internal_71013&sourcepage=register

[JavaOne] JavaOne San Francisco 2013 Content Catalog Live!

原文はこちら。
https://blogs.oracle.com/javaone/entry/javaone_san_francisco_2013_content

500以上のテクニカルセッション、BOF(Birds of a Feather)、チュートリアル、ハンズオンが予定されています。今年は新たに"Securing Java"というトラックが新設されました。今年のトラックは以下の通りです。
JavaOne 2013 San Franciscoコンテンツカタログ
https://oracleus.activeevents.com/2013/connect/search.ww?eventRef=javaone
  • Client and Embedded Development with JavaFX
  • Core Java Platform
  • Edge Computing with Java in Embedded, Smart Card, and IoT Applications
  • Emerging Languages on the Java Virtual Machine
  • Securing Java
  • Java Development Tools and Techniques
  • Java EE Web Profile and Platform Technologies
  • Java Web Services and the Cloud
コンテンツカタログからトラックやセッションの種類、セッションカテゴリ、キーワード、タグなどで検索できますし、お気に入りのスピーカーで今年のプレゼンは何かを確認することもできます。直接カタログから、関心のあるセッションを数多あるソーシャルメディアを使って友人や同僚に共有することも可能です。

是非JavaOneのコンテンツをチェックし、コンファレンスの週の計画を立てて下さい。そして、スケジュールツールが使えるようになった時点でチェックしたセッション登録の準備が完了しているはずです。

[Java] Java Developers Workshop 2012 Summer - Java EE特別集中講座 - のオンデマンド動画

昨年Java EE 6についてしっかり勉強しよう、というコンセプトで開催された、【Java Developers Workshop 2012 Summer】Java EE 特別集中講座がオンデマンド視聴できるようになっています。
WMV形式またはMP4形式なので、PC、Smartphone、Tabletから、いつでもどこでも何度でもご覧いただけます。
昨年のセミナーに参加された方も、されなかった方も、これからJava EE 6を勉強しよう、という方も、是非ご利用下さい。
なお、視聴にはOracleアカウント(OTNのアカウント)が必要です。まだお持ちでない場合には登録頂く必要があります。
Oracle Technology Networkオンライン・セミナー シリーズ
【Java Developers Workshop 2012 Summer】 – Java EE 特別集中講座 –
http://www.oracle.com/webfolder/technetwork/jp/online/onlineseminar_20120823.html

[Java] deny-uncovered-http-methods in Servlet 3.1

原文はこちら。
https://blogs.oracle.com/theaquarium/entry/deny_uncovered_http_methods_in

Servlet 3.1はJava EE 7の中では比較的マイナーなリリースですが、このJava EEの基本APIには非常に重要な変更が含まれています。そういった機能の一つに、新しいdeny-uncovered-http-methodsオプションのような、Servlet 3.1で実装されたセキュリティ機能の強化があります。
Servlet 3.1の共同スペックリードであるShing Wai Chanがこの機能のユースケースを概説し、使い方をコード例と共にブログエントリで紹介しています。
deny-uncovered-http-methods in Servlet 3.1
https://weblogs.java.net/blog/swchan2/archive/2013/04/19/deny-uncovered-http-methods-servlet-31
公式の仕様書を調査したり、リリースされているJava EE 7 SDKでお試し頂くことも可能です。
JSR-000340 JavaTM Servlet 3.1 Final Release for Evaluation
http://download.oracle.com/otndocs/jcp/servlet-3_1-fr-eval-spec/index.html
Java EE 7 SDK Downloads
http://www.oracle.com/technetwork/java/javaee/downloads/index.html

[Database, Cloud] Delivering Oracle DBaaS: Journey to Enterprise Cloud with Oracle Database 12c

原文はこちら。
https://blogs.oracle.com/dbcloudcoverage/entry/journey_to_enterprise_cloud_with

Oracle Database 12cのリリースには、詳細な新機能やこのメジャーリリースのオプションを詳細に説明する資料が付属します。ですが、読んだり調査したりする対象が非常にたくさんあるため、どれから手をつければいいのでしょうか?すべてに目を通す時間がない場合、最も興味のあるユースケースの観点で読む対象を整理したいとお考えでしょう。プライベートデータベースクラウドのDatabase as a Serviceに興味があるなら、以下のホワイトペーパーから始めることをお薦めします。
Accelerate the Journey to Enterprise Cloud with Oracle Database 12c
http://www.oracle.com/technetwork/database/database-cloud/journey-to-enterprise-cloud-wp-1959164.pdf
このホワイトペーパーではエンタープライズクラウドへの道のりのフェーズを説明すると共に、各フェーズでサポートするOracle Database 12cの新機能やオプションを列挙しています。Oracle Multitenantが目立っていますが、クラウド化のためのトピックはこれだけではありません。Oracle Database Quality of Service Management、Application Continuity、Automatic Data Optimization、Global Data Services、そしてActive Data Guard Far SyncなどすべてがDatabase as a Serviceのための重要な恩恵・価値を提供します。

このホワイトペーパーに含まれている参考資料を読み、調査されることを推奨します。

[Database, Database Integration] Oracle Database 12c

原文はこちら。
https://blogs.oracle.com/warehousebuilder/entry/oracle_database_12c

今日はOracle Database 12cがリリースされ非常にわくわくする日です。OTNのページでリリースに関するたくさんの情報を入手することができます。
Oracle Database 12c
http://www.oracle.com/technetwork/database/enterprise-edition/overview/index.html
(訳注)日本語ページは2013/06/26 8:30現在まだありません。

このリリースにあわせて、Oracleのデータ統合(Data Integration)ロードマップのマイルストンに到達しています。つまり、OWB(Oracle Warehouse Builder)はデータベースに同梱されない、ということです。お気づきかと思いますが、OWBのドキュメントはOracle Databaseのドキュメントライブラリに含まれていません。11.2と12.1のドキュメントを下図で比較してみてください。
OWB 11gR2はOracle Database 12cでもサポートされます。Oracle Database 12cでご利用になる場合、11.2.0.3にCP2以上を組み合わせたものが動作保証されています。11.2.0.4ではまとめられて1回のインストールで利用できるようになる予定です。

11gR2(11.2)の場合…


対して、12c (12.1)の場合…

[Java] JSF 2.2, Interceptors 1.2, and JPA 2.1 Replay: Java EE 7 Launch Webinar Technical Breakouts on YouTube

原文はこちら。
https://blogs.oracle.com/theaquarium/entry/jsf_2_2_interceptors_1

以前お伝えしたように、Java EE 7 Launch Webcastのオンデマンド視聴ができるようになっています。Strategic/Technical Keynoteとその他のTechnical Breakoutセッションをご覧頂けます。
View the On-Demand Replay of Java EE 7 Launch Event
https://blogs.oracle.com/theaquarium/entry/view_on_demand_replay_of
http://orablogs-jp.blogspot.jp/2013/06/view-on-demand-replay-of-java-ee-7.html

JSON 1.0, EJB 3.2, Batch 1.0 Replay: Java EE 7 Launch Webinar Technical Breakouts on YouTube
https://blogs.oracle.com/theaquarium/entry/json_1_0_ejb_3
http://orablogs-jp.blogspot.jp/2013/06/json-10-ejb-32-batch-10-replay-java-ee.html

WebSocket 1.0, CDI 1.1, Concurrency 1.0 Replay: Java EE 7 Launch Webinar Technical Breakouts on YouTube
https://blogs.oracle.com/theaquarium/entry/websocket_1_0_cdi_1
http://orablogs-jp.blogspot.jp/2013/06/websocket-10-cdi-11-concurrency-10.html

JAX-RS 2.0, JTA 1.1, JMS 2.0 Replay: Java EE 7 Launch Webinar Technical Breakouts on YouTube
https://blogs.oracle.com/theaquarium/entry/jax_rs_2_0_jta
http://orablogs-jp.blogspot.jp/2013/06/jax-rs-20-jta-11-jms-20-replay-java-ee.html
YouTubeチャネルのGlassFishVideosにTechnical Breakoutセッションをアップしています。今回はJSF 2.2、Interceptors 1.2、JPA 2.1の3本です。
Sparky GlassFish
http://www.youtube.com/GlassFishVideos
JSF 2.2


Interceptors 1.1


JPA 2.1


次の動画をUpするまでの間、是非お楽しみ下さい。
あと、Java EE 7 SDKのダウンロードと付属する数多くのサンプルを試すことをお忘れなく!
Java EE 7 SDK
http://oracle.com/javaee

[EM, Hardware] Japanese Documentation

原文はこちら。
https://blogs.oracle.com/opscenter/entry/japanese_documentation

日本のOracleチームがOps Centerのドキュメントサイトの日本語への翻訳を完了しました。このドキュメントが関係する人は、特定の数のバイリンガル読者のみであることは承知していますが、その選ばれた一部の方である場合には、是非ご覧になって下さい。
Oracle Enterprise Manager Ops Center ドキュメント・ライブラリ(12.1.3)
http://docs.oracle.com/cd/E41832_01/index.htm
[訳注]
英語版のドキュメントは以下からどうぞ。
Enterprise Manager Ops Center Documentation Library (12.1.3)
http://docs.oracle.com/cd/E27363_01/index.htm

[Database] Oracle Database 12c is available for download now!

原文はこちら。
https://blogs.oracle.com/UPGRADE/entry/finally_oracle_database_12c_is

みなさん、お待たせしました!とうとう、Oracle Database 12c(Oracle 12.1.0.1)がOracle Software Cloud(旧称eDelivery)やOTN(Oracle Technology Network)からダウンロードできるようになりました。現在Linux 64bit版をダウンロードできます。Sokarisはあと数時間のうちにダウンロードできるようになるようです。
[訳注]
日本時間2013/06/26 6時45分現在、Solarisもダウンロードできるようです。
そして、Oracle ExadataやSuperClusterでもサポートされる予定です。

Oracle Database 12cのリリースに伴い、新しいアップデート、移行、統合に関するスライド資料を用意しました。
Upgrade, Migrate and Consolidate to Oracle Database 12c
http://apex.oracle.com/pls/apex/f?p=202202:2:::::P2_SUCHWORT:migrate12c
ページ数は500枚以上(すいません、またやってしまいました)で、以下の内容を取り扱っています。
  • 新しくなったパラレルアップグレード(Parallel Upgrade)、アップグレード事前/事後の手直し作業に関すること
  • 新しい完全に可搬なエクスポート/インポート機能(Full Transportable Export/Import)
  • 以前Pluggable DatabaseとかContainer Databaseと呼ばれたOracle Multitenant
  • 数多くの新しいパラメータ、クールで有用な機能などなど
  • "Upgrade, Migrate and Consolidate to Oracle Database 12c"のスライドをダウンロードして下さい!
もちろん、このスライドは近い将来アップデートされていきます。

[Java] Testing javac: more, faster

原文はこちら。
https://blogs.oracle.com/jjg/entry/speeding_up_javac_tests#fn2

どれほどJavacのテストを改善してきたか、少なくとも主要なLangtoolsユニットや会期テストスイートの中でどれほど改善したかを見返すのは楽しいものです。
Raising the (langtools) quality bar
https://blogs.oracle.com/jjg/entry/raising_the_langtools_quality_bar
Speeding up tests again: another milestone
https://blogs.oracle.com/jjg/entry/speeding_up_tests_again_more
JDK5、6、7、現在はJDK8の、"最先端"のテストで最近集めたいくつかの数値をご紹介しましょう。これらの数値を対応するJDKビルドの各リリースのjavacのテストを実行して収集しました。各実行において、以下の情報を記録しました。
  • javacテストの数
  • テスト実行の経過時間
  • javacの呼びだし回数(生成されたJavaCompilerオブジェクトの個数を計測)
  • ユニットテスト回数の表示(作成されたContextオブジェクトを計測)
テストはすべて同一のハードウェア(Ubuntuの12.04を実行している中間的な大きさのサーバ)で実施し、その他のジョブはテスト中に同時に走らせていません。jtregの同一バージョンをすべてのテストの実行で使用しました。JDK 5でのテストはjtregの "samevm"で動作するように設定しておらず、そのため、より遅い"othervm"モードで実行しなければなりませんでした(このモードでは、各コンパイルおよびテスト実行で新しいJVMを作成します)。すべてのテストを連続的に実行しました。つまり、jtreg機能を使って同時にテストを実行してはいません。また、これらの実験を任意の特別注意深く制御された科学的な方法で行ったという主張はしません。
Description Notes Release/build 
5u51 6u51 7u25 8-b92
実行モード othervm samevm samevm samevm
経過時間(mm:ss.00) 同一H/W
同一jtreg
08:12.64 03:02.82 05:29.83 12:19.22
%CPU 145% 171% 217% 492%
#javac tests in test/tools/javac/ 845 1140 1705 2436
#compilations #JavaCompiler.<init> 848 1594 41922 381301
#contexts (indicative of unit tests) #Context.<init> 850 1790 271642 591950
テスト1回あたりの平均時間 00:00.583 00:00.160 00:00.193 00:00.303
コンパイル1回あたりの平均時間 00:00.581 00:00.115 00:00.008 00:00.002
テスト1回あたりの平均コンパイル回数 1.00 1.40 24.59 156.53

この数値の意味するところは?

最初(5u51)と最後(8-B92)の列で最も単純な比較をすると、同じハードウェアで、前者に比べて後者は50%余計にテストに時間がかかります。とはいえ、2005年当時には同じハードウェアはなかったのですから、これはいささか不公平な比較でしょう。個人的な思い出を申し上げれば、当時使っていたテストは実行にほぼ30分ほどかかっていました。しかし、たとえテスト実行が50%余分に時間がかかることが許可されていたとしても、その時間で実行できる内容が全く違います…
  • ほぼ3倍のテスト回数(2436 vs. 845)
  • 450倍のコンパイル回数 (381301 vs.848)
  • 以前とは比較にならない、21万回以上のユニットテスト (591950-381301)
5u51 (08:12.64)から6u51 (03:02.82)の経過時間の変化は興味深いもので、このことはothervmモードからsamevmモードへの変更による利得を示しています。
CPU使用率の数値はLinuxのtimeコマンドで取得したものであり、複数プロセッサの可用性を反映しています。JDK 5においてさえも、HotSpotはマルチプロセッサを利用できました。より最新のリリースでの大きな数値はテストがより多くのプロセッサを使用していることを示しています。特にJDK 8でのテストでは。

何をしてきたのか?

改良は多くの要因の結果ですが、これは「より少ない時間で、より多くのことを行うために、End to EndのTLC(Total Landed Cost)」としてまとめられるものです。
以下のリストでこれまでにやってきたことをまとめました。
  • jtregのsamevmモードを修正
  • javacを修正し、テストハーネスで動作するようにした(診断のための特別なテストモードを含む)
  • シェルテストの利用を削減(以下のリンクを参照)
    Shelling Tests
    https://blogs.oracle.com/jjg/entry/shelling_tests
  • 各テストで多くの、時には何千ものテストケースを実行することにより、テストを改善
  • javacインフラストラクチャをできるだけテストケースで共有するようにテストを最適化
  • (同時テスト実行が可能になる)jtregのagentvmモードを追加
  • フックをjavacに追加してよりよいユニットテストを容易に実施
  • 1回のテストで同時にテストケースを実行することにより、最新のハードウェアを活用

今後は?

以前、othervmまたはsamevmモードを使用してサーバー上でテスト実行したと申し上げましたが、サーバーの機能をより活用するため、もう一つ追加のテストを実行しました。この実行では、16のテストを同時に実行することができました。以下の表は、以前の結果で関連するデータと、追加テスト実行の結果得たデータを並べたものです。
Description Release/build
5u51 6u51 7u25 8-b92
実行モード samevm samevm samevm samevm agentvm
同時実行数 1 1 1 1 16
経過時間 08:12.64 03:02.82 05:29.83 12:19.22 2:06.91
%CPU 145% 171% 217% 492% 2198%
16個のテストを並列実行することで大きな高速化を期待されるかもしれませんが、遅いテストがいくつかあった結果、46秒ほど経過時間が延びています。そうしたテストを除けば、残りのテストは、1分23秒で完了していました。この数値をどのようにご覧になるでしょうか。

謝辞

ここで説明する結果は、過去長年にわたって、javacに携わりテストしてきた多くの人々(Maurizio, Brian, Joe, Kumar, Vicente, Alex, Steve, Sue, Sonali, Matherey、JCK-compilerチーム)のおかげです。

[Cloud, Virtualization, Support] Oracle and Microsoft Expand Choice and Flexibility in Deploying Oracle Software in the Cloud

原文はこちら。
https://blogs.oracle.com/cloud/entry/oracle_and_microsoft_join_forces

OracleとMicrosoftは、Oracleのソフトウェアを展開する方法により多くの選択と柔軟性を提供することにより、お客様がクラウドコンピューティングをと新しいパートナーシップを結びました。

[訳注]
プレスリリースはこちら。
Microsoft and Oracle announce enterprise partnership
Deal will help customers embrace cloud computing by providing greater choice and flexibility.
http://www.oracle.com/us/corporate/press/1964592
以下がこのパートナーシップの主要な要素です。
  • 本日より、Oracleのお客様はサポートされたOracleのソフトウェアをWindows Server Hyper-VおよびWindows Azureで実行することができる
  • 本日より、OracleのソフトウェアをWindows Azureで実行したいお客様のために、Oracleはライセンスを移動できるようにする
  • Microsoftは、Windows AzureイメージギャラリーにJava、Oracle Database、WebLogic Serverを含むOracleソフトウェアのよく利用される構成のInfrastructure Serviceインスタンスを追加する予定である
  • MicrosoftはWindows Azureで完全にライセンス許諾され、サポートされたJavaを提供する予定である
  • OracleはWindows Azure上の事前構成済みインスタンスとして、Oracleソフトウェアの様々な構成をもつOracle Linuxを提供する予定である
Oracleの戦略およびコミットメントは複数のプラットフォームをサポートすることであり、Microsoft Windowsは長きにわたって重要なサポート対象のプラットフォームです。Oracleは本日、そのサポートをWindows Server Hyper-VおよびWindows Azureに拡張し、Windows Server Hyper-VおよびWindows AzureでのOracleのアプリケーション、ミドルウェア、データベース、Java、Oracle Linuxの動作保証ならびにサポートを提供します。本日をもって、お客様は、OracleのソフトウェアをOracleのプライベートクラウドおよびパブリッククラウド、その他サポートされたクラウド環境だけでなく、MicrosoftのプライベートクラウドおよびWindows Azureに展開できます。
Windows Azureにおけるソフトウェアライセンスに関する情報は、以下のLicensing Oracle Software in the Cloud Computing Environmentをご覧下さい。
Licensing Oracle Software in the Cloud Computing Environment
http://www.oracle.com/us/corporate/pricing/cloud-licensing-070579.pdf
また、Oracle Supportポリシーは、Windows AzureやWindows Server Hyper-Vで実行するOracleソフトウェアに適用するように、以下の2個のMy Oracle Support(MOS)のNoteに記載されています。
[Note 1563794.1]Certified Software on Microsoft Windows Server 2012 Hyper-V - NEW
https://support.oracle.com/epmos/faces/DocumentDisplay?id=1563794.1
MOS Note 1563794.1
[Note 417770.1] Oracle Linux Support Policies for Virtualization and Emulation - UPDATED
https://support.oracle.com/rs?type=doc&id=417770.1
MOS Note 417770.1

[Java] JDK 7u25: Solutions to Issues caused by changes to Runtime.exec

原文はこちら。
https://blogs.oracle.com/thejavatutorials/entry/changes_to_runtime_exec_problems

WindowsプラットフォームでRuntime.execに伴う問題に直面したJava開発者のために、Java engineeringチームが以下のサンプルを用意しました。

Background

JDK 7u21で、以下のメソッドに指定するコマンド文字列のデコードがより厳密になりました。
  • Runtime.exec(String)
  • Runtime.exec(String,String[])
  • Runtime.exec(String,String[],File)
詳細はJDK 7u21のリリースノートをご覧下さい。
JDK 7u21 Release Notes for more information
http://www.oracle.com/technetwork/java/javase/7u21-relnotes-1932873.html#jruntime
これが原因で、アプリケーションに問題が発生する場合があります。以下のセクションで開発者が直面した問題と解決策をご紹介します。

[注意1]
JDK 7u25では、システムプロパティ jdk.lang.Process.allowAmbigousCommands を使ってチェックプロセスを緩和することができますので、変更できないアプリケーションの回避策として有効です。回避策はSecurityManagerを使わずに実行するアプリケーションに対してのみ有効です。詳細はJDK 7u25のリリースノートをご覧下さい。
JDK 7u25 Release Notes for more information
http://www.oracle.com/technetwork/java/javase/7u25-relnotes-1955741.html
[注意2]
Windows APIのCreateProcessの呼び出しに関する詳細を知るには、以下のページをご覧下さい。
CreateProcess function (Windows)
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v=vs.85%29.aspx

Runtime.execの呼び出し方法は2種類あります。
  1. 文字列としてコマンドを渡す場合
    Runtime.exec(String command[, ...])
  2. 文字列の配列としてコマンドを渡す場合
    Runtime.exec(String[] cmdarray [, ...] )
このセクションで説明する問題は、前者の呼び出し方法に関連します。前者の呼び出し方法を使用する場合、開発者は、コマンドは最初に実行可能ファイル名と引数の部分に分割される必要があるWindowsに対し、コマンドを「そのまま」渡すことを期待します。しかしコマンドの引数は、JavaのAPIに従って空白文字(スペース)で実行可能ファイル名と引数に分割されます。

Problem 1: "The file path for the command includes spaces"

次のような呼び出しでは、
Runtime.getRuntime().exec("c:\\Program Files\\do.exe")
引数を空白文字で分割し、以下のような文字列の配列にとして取り扱います。
c:\\Program, Files\\do.exe
処理された配列の最初の要素を実行可能ファイル名として解釈し、(存在する場合には)SecurityManagerが検証し、実行可能パスの曖昧さを避けるため、引用符(”)で囲みます。
この結果、間違ったコマンドになってしまいます。
"c:\\Program" "Files\\do.exe"
これでは動きませんね。

Solution:

ProcessBuilderもしくはRuntime.exec(String[] cmdarray [, ...] )を使うか、実行可能パスを引用符で囲みましょう。
アプリケーションコードを変更できず、SecurityManagerを使っていない場合には、Javaプロパティjdk.lang.Process.allowAmbigousCommandsの値をコマンドラインからtrueに設定することで回避できます。これによりチェックプロセスが緩和され、曖昧な入力を許可します。
-Djdk.lang.Process.allowAmbigousCommands=true

Examples:

new ProcessBuilder("c:\\Program Files\\do.exe").start()
Runtime.getRuntime().exec(new String[]{"c:\\Program Files\\do.exe"})
Runtime.getRuntime().exec("\"c:\\Program Files\\do.exe\"")

Problem 2: "Shell command/.bat/.cmd IO redirection"

以下のような暗黙のcmd.exe呼び出しでは
Runtime.getRuntime().exec("dir > temp.txt")
new ProcessBuilder("foo.bat", ">", "temp.txt").start() 
Runtime.getRuntime().exec(new String[]{"foo.cmd", ">", "temp.txt"})
次のような間違ったコマンドに解釈してしまいます。
"XXXX" ">" temp.txt

Solution:

コマンドを正しく指定するには、以下のオプションを使いましょう。
Runtime.getRuntime().exec("cmd /C \"dir > temp.txt\"")
new ProcessBuilder("cmd", "/C", "foo.bat > temp.txt").start()
Runtime.getRuntime().exec(new String[]{"cmd", "/C", "foo.cmd > temp.txt"})
もしくは
Process p = new ProcessBuilder("cmd", "/C" "XXX").redirectOutput(new File("temp.txt")).start();

Problem 3: "Group execution of shell command and/or .bat/.cmd files"

検証が強制されているため、以下の呼び出しの引数では間違ったコマンドを生成してしまいます。
Runtime.getRuntime().exec("first.bat && second.bat")
new ProcessBuilder("dir", "&&", "second.bat").start()
Runtime.getRuntime().exec(new String[]{"dir", "|", "more"})

Solution:

コマンドを正しく指定するためには、以下のオプションを使いましょう。
Runtime.exec("cmd /C \"first.bat && second.bat\"")
new ProcessBuilder("cmd", "/C", "dir && second.bat").start()
Runtime.exec(new String[]{"cmd", "/C", "dir | more"})
同じシナリオはcmd.exeの持つ以下の演算子"&", "||", "^"でも有効です。

Problem 4: ".bat/.cmd with special DOS chars in quoted params”

検証が強制されているため、以下の呼び出しの引数では例外を発生させてしまいます。
Runtime.getRuntime().exec("log.bat \">error<\"")
new ProcessBuilder("log.bat", ">error<").start()
Runtime.getRuntime().exec(new String[]{"log.bat", ">error<"})

Solution:

コマンドを正しく指定するには、以下のオプションを使いましょう。
Runtime.getRuntime().exec("cmd /C log.bat \">error<\"")
new ProcessBuilder("cmd", "/C", "log.bat", ">error<").start()
Runtime.getRuntime().exec(new String[]{"cmd", "/C", "log.bat", ">error<"})

Examples:

次のようなシェルの複雑なリダイレクト
cmd /c dir /b C:\ > "my lovely spaces.txt"
は以下のようになります。
Runtime.getRuntime().exec(new String[]{"cmd", "/C", "dir \b >\"my lovely spaces.txt\"" });

The Golden Rule:

たいていの場合、 cmd.exeは2個の引数をとります。"/C"と解釈のためのコマンドです。

[Solaris, Hardware] June 27 Webcast: Announcing Oracle's Fastest Engineered System

原文はこちら。
https://blogs.oracle.com/solaris/entry/supercluster_2013_launch

世界最速のマイクロプロセッサーを手にして、Engineered Systemを作ったら、どうなるでしょう?次週明らかになります。でも「fast」という言葉が入っていると思います。

もしかすると、「fastest」かも…うん、そうでしょうね。

Live Webcast: Announcing Oracle SuperCluster T5-8
2013年6月27日(木)10時(PDT)、13時(EDT)

日本時間では、2013年6月28日(金)2時から
登録はこちらからどうぞ。

[Java] JAX-RS 2.0, JTA 1.1, JMS 2.0 Replay: Java EE 7 Launch Webinar Technical Breakouts on YouTube

原文はこちら。
https://blogs.oracle.com/theaquarium/entry/jax_rs_2_0_jta

以前のエントリでご紹介したように、On-Demand Replay of Java EE 7 Launch Webcastの録画がご覧頂けるようになっています。Strategy/Technical Keynoteとその他全てのTechnical Breakoutセッションもご覧頂けます。
JSON 1.0, EJB 3.2, Batch 1.0 Replay: Java EE 7 Launch Webinar Technical Breakouts on YouTube
https://blogs.oracle.com/theaquarium/entry/json_1_0_ejb_3
http://orablogs-jp.blogspot.jp/2013/06/json-10-ejb-32-batch-10-replay-java-ee.html

WebSocket 1.0, CDI 1.1, Concurrency 1.0 Replay: Java EE 7 Launch Webinar Technical Breakouts on YouTube
https://blogs.oracle.com/theaquarium/entry/websocket_1_0_cdi_1
http://orablogs-jp.blogspot.jp/2013/06/websocket-10-cdi-11-concurrency-10.html
View the On-Demand Replay of Java EE 7 Launch Event
https://blogs.oracle.com/theaquarium/entry/view_on_demand_replay_of
YouTubeチャネル「GlassFishVideo」にTechnical Breakoutの新たな動画を追加しました。
Sparky GlassFish
http://www.youtube.com/GlassFishVideos
今回追加した動画は、Java API for RESTful Web Services 2.0、Java Transaction API 1.2、Java Message Service 2.0の3本です。

次の動画をリリースするまでの数日間でご覧頂ければと思います。
あと、Java EE 7 SDKのダウンロードと付属する数多くのサンプルを試すことをお忘れなく!
Java EE 7 SDK
http://oracle.com/javaee

[Java] WebSocket 1.0, CDI 1.1, Concurrency 1.0 Replay: Java EE 7 Launch Webinar Technical Breakouts on YouTube

原文はこちら。
https://blogs.oracle.com/theaquarium/entry/websocket_1_0_cdi_1

Java EE 7 Launch Webcastの動画がご覧頂けます。
View the On-Demand Replay of Java EE 7 Launch Event
https://blogs.oracle.com/theaquarium/entry/view_on_demand_replay_of
Strategy/Technical Keynoteとその他のTechnical Breakoutセッションをご覧頂けます。
以前お伝えしたように、Technical Breakoutセッションとして新しい動画をYouTubeチャネルのGlassFishVideosに追加しました。
JSON 1.0, EJB 3.2, Batch 1.0 Replay: Java EE 7 Launch Webinar Technical Breakouts on YouTube
https://blogs.oracle.com/theaquarium/entry/json_1_0_ejb_3
http://orablogs-jp.blogspot.jp/2013/06/json-10-ejb-32-batch-10-replay-java-ee.html
Sparky GlassFish
http://www.youtube.com/GlassFishVideos
今回追加したのは、Java API for WebSocket 1.0、Contexts and Dependency Injection 1.1、そしてConcurrency Utilities for Java EE 1.0の3個の動画です。

次の動画をリリースするまでの数日間でご覧頂ければと思います。
あと、Java EE 7 SDKのダウンロードと付属する数多くのサンプルを試すことをお忘れなく!
Java EE 7 SDK
http://oracle.com/javaee

[Java] Android for Embedded? Facts to Consider

原文はこちら。
http://terrencebarr.wordpress.com/2013/06/20/android-for-embedded-facts-to-consider/

組み込み製品を開発する上で、Androidはよい選択でしょうか。すべての事実を考慮するべきでしょう。このPartnercastの動画で、Henrik Stahlが参加者からの質問に答え、非常に価値のある洞察を共有しています(7分55秒あたりから始まります)
PartnerCast: Oracle Java Embedded Updates
http://medianetwork.oracle.com/video/player/2369664538001
[要旨]
Androidは、標準ではないLinuxベースのスマートフォンOSで、専用機器用に設計されているAndroid APIを用いて開発し、2~3年ほどのライフサイクルです。Androidは標準ベースではなく、公開されているロードマップはなく、予測可能なライフサイクルもなければ、3rdパーティーのサポートもありません。
Androidベースで5~20年もの間、市場の組み込み製品の開発、メンテナンスをするのは非常にリスクの高い提案です。
それに対しJavaは標準ベースのプラットフォームであり、オープンなロードマップを持ち、透明性の高いコミュニティプロセスや大規模な3rdパーティープロバイダー、パートナー、開発者のエコシステムがあります。OracleのJava製品は、非常に小さくリソースの制限があるシステムから、大規模かつ協力なシステムまでの幅広いプラットフォームをカバーしており、長期にわたるサポートが付属しています。

[SOA] Fanning Out Events on the Oracle SOA Suite 11g Event Delivery Network

原文はこちら。
http://www.oracle.com/technetwork/articles/soa/jellema-events-soasuite-1902429.html

著者について
Lucas Jellemaは、1994年以来(Oracleと共に)ITで活躍してきました。 Oracle Fusion MiddlewareのOracle ACE DirectorであるLucasは、Oracle Database(SQL、PL/SQL)、サービス指向アーキテクチャ、ADF、およびJavaを含む多様な分野でのコンサルタント、トレーナー、およびインストラクターです。彼はOracle SOA Suite 11g Handbookの著者であり、JavaOne、Oracle Open World、ODTUG Kaleidoscope、Devoxx、その他のコンファレンスでたくさんの発表を行っています。
Oracle SOA Suite 11g Handbook / By Lucas Jellema (Oracle Bookstore)
http://astore.amazon.com/oraclebooks-20/detail/0071608974

サンプルはこちら。
Sample code for this article (zip, 54kb)
http://www.oracle.com/technetwork/articles/soa/fanoutevent-sources-1903159.zip

Overview

この記事ではOracle SOA Suite 11gでイベントを使い、最大限分断しつつ、意味のある形で相互にビジネスプロセスが影響を与える方法をご説明します。具体的には、この記事ではEvent Delivery Network (EDN)イベントをよりきめ細かいレベルに広げるためのソリューションです。これを使うと、一つのイベントが複数の実行中のBusiness Process Execution Language (BPEL)プロセスのインスタンスに影響を及ぼすことができます。この記事では以下のOracle SOA Suite 11gコンポーネントを利用します。
  • BPEL
  • Mediator
  • Event Delivery Network
  • Spring
  • Locator API
  • Composite Sensors

Introduction

イベントとはメッセージですが、特定のコンシューマをターゲットにしていません。SOA環境においては、コンポーネント間の依存性を減らし、再利用性や柔軟性を増すためにdecoupling(分断)が主要な目的の一つであるため、イベントは極限まで分断して情報を共有するための価値ある方法です。

イベントのパブリッシャーは潜在的に他のコンポーネントが関心を持っているビジネスの状況を知るコンポーネントです。コンポーネントが責任をもって、関連する詳細情報と共に汎用的なイベントハンドラ基盤に対しイベントを渡します。パブリッシャーはイベントのサブスクライバーのことは認識していません。パブリッシャーはイベントで何が起こり、誰がイベントを消費するのか知っている必要はありません。

特定のビジネス·イベントに関心を持つすべてのコンポーネントが、イベントハンドラインフラストラクチャを使い、これらのイベントのリスナーとして登録できます。特定のビジネスイベントタイプのイベントがイベントハンドラに渡されるたびに、サブスクライブしているすべてのリスナーにイベントが発行されます。イベントのコンシューマーは、どこでイベントが発生し、どのように配信されるのかを知る必要はありません。
図1
イベントパブリッシャーやイベントコンシューマー間のつながりが完全に切れていることが、イベントとイベント駆動型アーキテクチャパターンを利用する上で大きな魅力的です。依存関係のないコラボレーションはアーキテクトの至高の目標と言ってもいいでしょう。

Events in the Oracle SOA Suite: EDN and BPEL

Oracle SOA Suite 11gはイベントハンドラ基盤を備えており、この基盤はビジネスイベントのパブリッシャーにとって仲介者であるとともに、こうしたイベントのコンシューマーでもあります。この基盤をEvent Delivery Network (EDN)と呼んでいます。
(注意)SCAコンポジットアプリケーションでイベントと共にJMSやAQを利用できます。

EDNで特定のイベントをサブスクライブ可能なコンポーネントの一つにBPELがあります。MediatorやBPMNもEDNイベントをサブスクライブできます。BPELプロセスはEDNイベントを次の2方法のうち1方法で受け取ることができます。
  • イベントで新しいBPELプロセスインスタンスを生成する
  • イベントが実行中のBPELプロセスインスタンスに消費される
最初のオプションは有用ですが、この記事ではもう一つの状況について取り上げます。イベントが実行中のイベントに消費されると、イベントは明らかにそのインスタンスや進行する向きに影響を与える可能性があります。このパターンを、ビジネスイベントが実行中のビジネスプロセスに影響を与える可能性のある状況で使います。このようなイベントの例としては、特定の国や会社との貿易の禁止、倉庫での火災、クライアントの死亡、または特定の製品またはサービスの即時撤退というように、かなり劇的な可能性があります。それほど劇的でない例では、(マーケティングキャンペーンに応答した)新しいクライアント、一般的な割引期間の開始や終了、病気で呼び出されるスタッフ、特定の製品の在庫枯渇があります。

ビジネスの条件が事前に定義されたビジネスイベントに対応するものと認識されているならば、イベントを発行します。イベントに反応して何が起こるか、どこで誰によって起こるかは目に見えないし、イベントのパブリッシャーにとっては無関係です。

この記事では、Termination of Customer(顧客の終了)というイベントを検討します。このイベントは、会社が顧客とのすべての取引を中止するべきであることを意味します。任意のセールスサイクルが中止され、全く出荷が行われず、保留中の注文がキャンセルされます。この影響力のあるイベントは、例えば顧客が破産を申請したとか、特定の連邦政府の調査対象であるような場合にパブリッシュされます。先ほど述べたように、イベントの発生元とその原因はイベントコンシューマーにとっては無関係です。終了対象の顧客のIDというシンプルなペイロードでイベントを流す必要があります。
図2
こうしたイベントコンシューマーの一つに、BPELプロセスのProcessOrderがあります。このプロセスは顧客からの注文を処理し、受注から出荷、そして後続の請求プロセスの起動までを取り扱います。下図はプロセスの概要を示しています。

図3
顧客資格が停止されると、すべての実行中のProcessOrderプロセスインスタンスが中断されます。この目的のため、BPELプロセス中のDoAllTheWorkというスコープにはイベントハンドラーがあり(図4参照)、終了イベントを消費してプロセスを正常に終了することができます。
図4
相関に基づいて実行中のBPELプロセスインスタンスでイベントを消費することができます。BPELの相関の本質は、すべてのプロセスインスタンスが一意のキーを持つ、ということです。これは相関識別子という、着信メッセージやプロセス内で確立された派生したもので、これを使い、インスタンスと着信メッセージやイベントを関連付けます。相関関係を成功するためには、この着信メッセージやイベントはこの一意のキーを含む必要があります。

The challenge at hand

すでにこの記事で直面している課題に目星がついていることでしょう。一つのTerminateCustomerイベントが多くのProcessOrderというBPELインスタンスに影響を与える可能性がある、ということです。しかし、これらのインスタンスは、その一意の識別子に基づいて着信イベントと相関させることができます。それゆえ、EDNの任意のイベントをせいぜい一つのBPELプロセスのインスタンスが消費できるのです。

同じ顧客に対して同時に処理されている複数のオーダーが存在し得るので、ProcessOrderインスタンスをCustomerIDで一意に識別することができません。その代わりに、ProcessOrderインスタンスはそのOrderIDで識別されています。

イベントを発行し、現在その取引を停止する顧客のために処理されているすべての注文のために、一つのTerminateCustomerイベントを複数のAbortOrderForCustomerイベントに変換する解決策を見つける必要があります。 AbortOrderForCustomerイベントのペイロードには、OrderIDが含まれており、これを使ってProcessOrderというBPELプロセスの1つのインスタンスに正確に関連付けることができます。
図5

Addressing the challenge

やるべきことは明確で、ビジネスイベントと紐付けるきめ細かい詳細情報を見つけ出し、その各々の詳細情報に対し、適切なイベントを発行する、ということです。この場合、ビジネス·オブジェクトのCustomerに詳細Orderオブジェクトが関連付けられています。TerminateCustomerイベントの場合、当該顧客の実行中の受注を検索し、その後、各注文に対しAbortOrderForCustomerイベントを発行する必要があります。イベントの発行は簡単です。Oracle SOA SuiteでMediatorが完璧にうまくやってくれます。

本当の問題は、実行中のProcessOrderインスタンスを検索する方法です。ここでは、Oracle SOA SuiteのAPIを利用して、プログラムでインスタンスを問い合わせることができます。APIを使うと、Composite Sensorの値でインスタンスをフィルタリングすることができます。ProcessOrderコンポジットがComposite SensorとしてCustomerIDが公開されている場合、特定のCustomerIDに紐付くインスタンスだけをAPIで取得することができます。このような各インスタンスのために、OrderIDが必要です。APIを使って簡単にインスタンスのセンサー値を取得できるため、OrderIDを含む2個目のComposite Sensorが役に立ちます。

これを念頭に置いて、この課題に対する解決策の案を図6に作ってみました。最初の1枚は、Oracle OpenWorld期間中に開催されたOracle SOA Suite Customer Advisory Boardでナプキンに走り書きしたものです。明らかに思いつきですね。この案は以下の手順を含んでいます。
  1. 様々な顧客に対応する一つ以上のProcessOrderのBPELプロセス·インスタンスを開始する。このBPELプロセスを含むSOAコンポジット·アプリケーションには、2つのComposite Sensor(CustomerIDとOrderID)がある。
  2. TerminateCustomerイベントをEvent Delivery Network(EDN)発行する。ペイロードにはCustomerIDを含む。
  3. (不可能な手順):取引停止の顧客に対し実行しているすべてのProcessOrderインスタンスに、単一のイベントを渡す。
  4. 手順3のかわりに、Mediatorコンポーネントを使ってTerminateCustomerイベントを消費し、イベントからCustomerIDを抽出する。
図6
  1. (CustomerIDを渡して)Spring Contextコンポーネントを呼びだす…
  2. このSpring Contextコンポーネントは、Oracle SOA SuiteのJava APIを使ってComposite Sensorを使ってCustomerIDと紐付くProcessOrderのすべての実行中インスタンスを識別し、第2のComposite Sensorの値からこれらのインスタンスのOrderIDを収集する。
  3. 各OrderIDに対しMediatorを呼び出す
  4. MediatorはOrderIDをペイロードとして持つAbortOrderForCustomerイベントをEDNに対し発行する。
  5. 各AbortOrderForCustomerイベントはOrderIDと相関を持つProcessOrder BPELプロセスの一つの実行中インスタンスが消費する。BPELプロセスインスタンスは事前に定義されているロジックに従い終了する。
図7は、SOAコンポジットアプリケーションで実装が必要なコンポーネントを示しながら、走り書きから技術的な設計に落とし込んだものです。
図7

Implementation Steps

この記事の残りの部分では、上述のSOAコンポジットアプリケーションを実装するための手順を詳細に説明しますが、ここには、ProcessOrderビジネスプロセスを実行するためのBPELプロセスが含まれています。また、顧客に関連付けられた各注文のイベントにTerminateCustomerイベントを発行するMediatorとSpringコンポーネントが含まれています。EDNのイベントを定義し、最後に、アプリケーションを実際に動かしてご覧にいれましょう。

もちろん、この記事で説明したBPELプロセスは実際の運用環境で使うプロセスよりもずっとシンプルになっていますが、主要な要素とイベント発行メカニズムの価値を損なうわけではありません。

Implementing the ProcessOrder BPEL process

作業は新しいSOAコンポジットアプリケーションを(SOA Extensionインストール済みの)JDeveloper 11gで作成するところから始まります。このアプリケーションをFanoutEventと呼びます。現在のところ、プロジェクトにはSOAコンポジットが含まれています。これ以後記載のソースや成果物はこの記事からダウンロード可能なソースからご利用いただけます。
サンプルコード
http://www.oracle.com/technetwork/articles/soa/fanoutevent-sources-1903159.zip

Develop BPEL Process component ProcessOrder

ProcessOrder.wsdlファイルには、ProcessOrderというBPELプロセスが公開するWebサービスが記述されています。このサービスにはProcessOrderというportTypeがあり、一つの非同期オペレーションプロセスがあります。このオペレーションはProcessOrderRequestMessageという、一つのメッセージパートを持つ入力メッセージを取ります。このメッセージパートはProcessOrder.xsdファイルのOrder要素に定義されています。
図8
Order要素は非常にシンプルです。CustomerIdentifierとOrderIdentifierが製品名、品目個数、配達の詳細と共に渡されます。

サービスは非同期であるため、Callbackポートタイプが定義されています。このポートタイプには一つのオペレーション(processResponse)があり、ProcessOrderResponse要素を基にしたシンプルなシングルパートのメッセージを取ります。ところで、この記事の説明上、このレスポンスメッセージは全く無関係です。
図9
WSDLとXSDドキュメントに基づいて、BPELプロセスコンポーネントをコンポジットに追加します(図10)。
図10
このプロセスにはDoAllTheWorkという一つのスコープが含まれています。このスコープでは、すべての注文処理を実装することができますが、この記事では、そのような処理は必要ではありません。このスコープに含むものは、Waitアクティビティだけです。

Add Composite Sensors for CustomerIdentifier and OrderIdentifier

以前、イベントレベルの不一致に対する解決策を議論した際に、2個のComposite Sensorを導入しました。これらのセンサーを使うと管理者はOracle Enterprise Manager Fusion Middleware Controlのコンソールでコンポジットインスタンスを検索し抽出することができます。また、Java APIを使ってプログラムでインスタンスを検索することも可能です。

センサーアイコンを使うComposite Editorで、Composite Sensor Editorを使って最初のComposite Sensorを定義します。これをCustomerIdentifierと呼び、BPELが公開するSCA Serviceに接続しています。このセンサー値はリクエストメッセージ中のOrder要素のCustomerIdentifier要素から導出されます。言い換えると、このセンサー値はCustomerIdentifierに一致します。Process Orderインスタンスを作成するインスタンスのCustomerIdentifierに等しい、ということです(図11)。
図11
2個目のComposite Sensorを作成します。これもOrderIdentifierを出力します。Java APIを使ってこの値を保持し、送出するAbortOrderForCustomerイベントのペイロードとして使う必要があります(図12)
図12

Create AbortOrderForCustomer Event

XMLスキーマ定義ファイルのevents.xsdには AbortOrderForCustomerEventタイプがあり、ここでAbortOrderForCustomerというEDNイベントのペイロードを説明しています(図13)。
図13
AbortOrderForCustomerEventには子要素としてOrderIdentifierとCustomerIdentifier、motivationが含まれています。

このAbortOrderForCustomerEvent定義を基にして、AbortOrderForCustomerイベントをCustomerEvents.edlファイルで定義します。次の図はこのイベント定義を説明しています(図14)。
図14

Subscribe the ProcessOrder BPEL process to the AbortOrderForCustomer Event

この時点での状況は以下のようになっています。
非同期Webサービスと2個のコンポジットセンサーを公開するコンポジット。
さらに、コンポジット(もしくはコンポジットが包含するBPELコンポーネント)はEDNイベントAbortOrderForCustomerにサブスクライブされています。
図15

Setup Correlation

イベントをProcessOrderの実行中インスタンスに取り込むため、イベントの消費に対する相関を設定する必要があります。つまり、(OrderIDを使って)どのようにProcessOrderインスタンスを識別しすべきか、いつ、どのように一意のキーをインスタンスに割り当てるべきか、いつ、どのようにインバウンドメッセージやイベントをこの一意のキーと照合するか、を指定します。

まず、OrderIdentifierと呼ばれるプロパティに基づいて、相関セットOrderIdentifierCorrelationSetを作成します。
図16
これは単一の値を基にした一意のキーの定義を意味します。

次は、インバウンドメッセージやイベントと相関セット内のプロパティをマッピングするためのプロパティエイリアスを定義します。図17では、プロパティOrderIdentifierをインバウンドメッセージのProcessOrderRequestMessageのOrder要素に含まれるOrderIdentifierという子要素とマッピングしています。このプロパティをAbortOrderForCustomerEventペイロードのOrderIdentifier要素ともマッピングします。これにより、ProcessOrderRequestMessageとAbortOrderForCustomerEventの両方がProcessOrderインスタンスを一意に識別するために必要な情報を含んでおり、それらが相関の関係にある、ということをBPELエンジンに指示しています。
図17

Associate Receive and Message Handler with CorrelationSet

まだBPELプロセスから欠けているものが一つあります。我々は、一意のキーがインスタンスに設定されている場合、そしてその一意のキーを使って既存のインスタンスに着信イベントまたはメッセージを供給する場合、BPELエンジンに指示する必要があります。

ProcessOrderRequestMessage(および第作成されたインスタンス)を受信した場合、このプロセスで、相関セットを初期化します。ProcessOrderRequestMessageを受信し(インスタンスが最初に作成され)た際に、相関セットを開始します。最初のReceiveアクティビティで、相関セットOrderIdentifierCorrelationSetは[相関]タブに表示され、開始プロパティが[はい]に設定されています。

相関セットを使って着信するAbortOrderForCustomerイベントを既存のProcessOrderインスタンスに取り込みます。これはDoAllTheWorkスコープで定義されたonMessageイベントリスナーで起こります。OnMessageアクティビティもまた同じOrderIdentifierCorrelationSetを使って相関が構成されています。こんどは、インスタンスIDに割り当てたくなく、この値を使ってイベントを実行中のインスタンスにマッピングしたいため、開始プロパティが[いいえ]に設定されています。

図18ではReceiveアクティビティとOnMessageアクティビティの両方で相関を設定する方法を説目いしています。
図18

Implement the Event Fan Out machinery

TerminateCustomerイベントをCustomerevents.edlファイルに定義します。Fan-out mediatorがこのイベントをインターセプトする必要があります。このMediatorはTerminateCustomerイベントをEvent Delivery Networkを使ってサブスクライブします。イベントが到着すると、Mediatorがアクティブになり、Springコンポーネントを呼び出します。


SpringコンポーネントはTerminateCustomerイベントのペイロードに含まれる顧客IDを使って、正しい値を持つコンポジットセンサーCustomerIdentifierを出力する、すべての実行中のProcessOrderインスタンスを(SOA SuiteやJava APIを使って)検索します。Springコンポーネントは各インスタンスのコンポジットセンサーOrderIdentifierの値を抽出し、各インスタンスについてもう一つのMediatorを呼びだし、その特定のOrderIDの値について、AbortOrderForCustomerイベントをEDNにパブリッシュします。

Definition of the TerminateCustomer event

XMLスキーマ定義ファイルのEvents.xsdには、TerminateCustomerイベントのペイロードを定義するために使用される、TerminateCustomerタイプが含まれています。このペイロードは、少なくともcustomerIdentifierを含める必要があります。子要素motivationはおまけとして追加されています。
図20
TerminateCustomerイベントをCustomerEvents.edlファイルで定義します。このペイロードはXSDファイル内のTerminateCustomerタイプに基づいています。図21では、このコンポジットアプリケーションで認識されている2個のビジネスイベントを使ってedlファイルを紹介しています。
図21
TerminatorCustomerイベントを消費するMediatorを作成しましょう。
「イベントのサブスクライブ」テンプレートを基に、ConsumeTerminateCustomerというMediatorコンポーネントを作成します。イベント定義ファイルCustomerEvents.edlからこのコンポーネントがサブスクライブするイベントとして、TerminateCustomerイベントを選択します。
図22
イベントをサブスクライブするMediatorをコンポジットに追加します。
図23

Create the event publishing Mediator for AbortOrderForCustomer

次に追加するコンポーネントは、AbortOrderForCustomerイベントをパブリッシュするMediatorコンポーネントです。このMediatorのインターフェースを定義する簡単なWSDLドキュメントを設定しました。AbortOrderForCustomerイベントのペイロード定義を基にした入力要素を持つ、一方向のオペレーション(publishAbortOrderEvent)を含んでいます。
図24
AbortOrderForCustomerイベントを発行するため、ルーティングルールをMediatorに追加します。トランスフォーメーションはリクエストメッセージのペイロードパートからイベントペイロードへ、1対1のマッピングをします。
図25

Create and wire the Spring Component

SpringコンポーネントTerminateCustomerToAbortOrderEventTranslatorをコンポジット中に作成します。

MediatorコンポーネントPublishAbortOrderEventをSpringコンポーネントとつなぎます。このMediatorはSpringコンポーネントが要求するイベントを発行します。
図26

これはSpring bean定義ファイルで作成された任意のbeanに後で注入できるSpringコンポーネントでsca.referenceを作成します。
図27
この参照はPublishAbortOrderEventInterfaceというJava Interfaceを基にしており、これはMediatorのインターフェースを表現するWSDL用にJDeveloperが生成します。
図28
Springコンポーネントが提供するサービスを説明するCustomerToOrderEventProcessor Javaインターフェイスを作成します。このインタフェースは、TerminateCustomerイベントを処理でき、2個の文字列を入力値とするメソッドを定義しています。インタフェースで定義された2個目のメソッドは、前段で導入したPublishAbortOrderEventInterfaceの実装を注入するために使用されるセッターです。このJavaインターフェース由来のメディエータPublishAbortOrderEventは、既に作成済みのsca:referenceを通じてこの実装を提供します。
図29
Springコンポーネントが提供するsca:serviceを、現在Spring Bean定義ファイルで定義することができます。公開されている名前はCustomerToOrderEventProcessorで、サービスインターフェースは、Javaインターフェースによって指定されます。
図30
このsca:serviceのWSDLベースのインターフェース記述(CustomerToOrderEventProcessor.wsdl)は、Springコンポーネントのサービスをコンシューマと接続した際(この場合ComsumeTerminateCustomerというMediatorです。図31参照)に、は、JDeveloperが生成します。
図31
ソリューションの外殻を作成し、すべての結線が適切に配置されています。欠けているのは、Javaインターフェースを実装し、Springコンポーネントのsca:serviceが約束した実際の作業を実施するJava Spring Beanです。この実装は、次で説明します。

Implementing the Spring Bean

JavaクラスCustomerToOrderEventProcessorImplはCustomerToOrderEventProcessorインタフェースの実装で、processTerminateCustomerEventとsetPublishAbortOrderEventInterfaceの両メソッドを実装しています。

このクラスに基づくSpring Beanを次のように設定できます。
図32
CustomerToOrderEventProcessorBeanと呼ばれるBeanは、sca:serviceの実装を提供しており、このリンクはターゲット属性を介して確立されます。 (AbortOrderForCustomerイベントを発行するメディエータを通して注入される)sca:referenceはBeanのpublishAbortOrderEventInterfaceプロパティに設定されています。

クラスそのものは非常に簡単です。AbortOrderForCustomerEventオブジェクト、いわゆる"ペイロード"をメディエータに渡しイベントを発行する準備をします。このクラスは、customerIdentifierに対応する現在実行中のProcessOrderインスタンスからすべてorderIdentifierの一覧を取得します。その後、これらのorderIdentifierを反復処理し、それぞれに対応したMediatorを呼び出します。
図33
最も難しい作業は、collectOrderIdentifiersというプライベートメソッドで行われます。このメソッドは、Oracle SOA SuiteのJava APIと接続し、customerIdentifierに値を設定されたCustomerIdentifier Composite Sensorを使ってすべてのProcessOrderインスタンスをクエリします。
図34
このAPIによるクエリは、CustomerIdentifierという名前のComposite Sensorとセンサー値が設定されているSensorFilterを使っています。このAPIが返す各インスタンスから、OrderIdentifier Sensorの値は2つのステップで取得されます。まず、getSensorData()でインスタンス用のComposite Sensorのコレクションを取得します。続いて、このコレクションに対してOrderIdentifier Sensorのエントリを発見するという単純な繰り返し処理を実施します。値があればその値を読み取ります。こうして決定された値を、このメソッドが返すそのorderIdentifierのコレクションに追加します。
図35

Reviewing the work

これまで説明したすべての最終結果を図36に示します。通常のビジネスフローはBPELプロセスProcessOrderをアクティベートするProcessOrder_epサービスへの呼び出しです。このインスタンスは、その存続期間中いつでもAbortOrderForCustomerイベントを消費するような状態になっています。そのイベントは、Order IDに基づいてインスタンスに関連付けることができます。.

例外的なフローは、TerminateCustomerイベントを消費するMediatorから始まります。 Mediatorは、イベントのペイロードからCustomer IDを取得し、そのCustomer IDを渡してSpringコンポーネントTerminateCustomerToAbortOrderEventTranslatorを呼び出します。このコンポーネントは、Oracle SOA Suite Java APIを使い、Composite Sensorで設定されたCustomer IDを持つすべてのコンポジットインスタンスを見つけようとします。すべてのこれらのインスタンスのOrder IDは対応するセンサから取得され、各インスタンスについて、Order IDを渡してメディエータPublishAbortOrderEventを呼びだします。このMediatorはAbortOrderForCustomerイベントを発行します。

このイベントは、Order IDに基づいて、イベントと相関を持つBPELプロセスProcessOrderのインスタンスが消費します。その後、インスタンスが終了します。

図36はCompositeでイベント転送を可視化しています。ただし、イベントを発行するメディエータとイベントを消費するBPELプロセスの間には直接のリンクが存在しないことにご注意下さい。:この相互作用は完全にコンシューマからパブリッシャを分離するイベント配信ネットワークを介して実施されています。
図36

And... action!

SOAコンポジットアプリケーションは完全に自己完結しています。アプリケーションをOracle SOA Suiteランタイム環境に通常の方法でデプロイできます。
図37
JDeveloperアプリケーションをご覧頂くことができますし、図37のように、ご自身のOracle SOA Suite環境にデプロイすることもできます。

Run ProcessOrder instances

デプロイが終了したら、ProcessOrderプロセスのインスタンスを起動します。FanoutEventコンポジットをOracle Enterprise Manager Fusion Middleware Controlで選択し、[テスト]ボタンを押します(図38)。
図38
ProcessOrder_epサービスのリクエストメッセージの要素に対応するフィールドを持つWebサービスのテストページが現れます。Only the customerIdentifierとorderIdentifierのみが今回の目的に関係がありますので、それぞれABCと123Aを指定し、[Webサービスのテスト]ボタンを押してリクエストを発行します(図39)。
図39
以下のリストに従い、CustomerIDがABC、XYZ、PQRのProcessOrderインスタンスを複数起動します。

図40
この時点で、Oracle Enterprise Manager Fusion Middleware Controlをチェックしてインスタンスのリストを確認します。3個のインスタンスのComposite SensorがCustomer IDとOrder IDを出力しています(図41)
図41

Publish the TerminateCustomer event

シナリオ:顧客XYZは、もはや信頼できるビジネスパートナーではなく、すべての関係をすぐに切断するべきです。 TerminateCustomerイベントをこの顧客のために発行するべきです。このイベント発行の間接的な結果として、現在、顧客XYZのために実行しているProcessOrderのすべての5インスタンスを終了させたいと考えています。

テスト目的で、Enterprise Manager FMW ControlからEDNイベントを発行できます。soa-infraノードのコンテキストメニューから、[ビジネスイベント]を選択します。
図42
ビジネス·イベントのページの[テスト]ボタンを押すと、ポップアップウィンドウが開き、どのイベントを発行するか尋ねてきますので、図43のように、このイベントのXMLペイロードをテキストフィールドに入力し、[発行]ボタンを押します。
図43
TerminateCustomerイベントはcustomerIdentifierにXYZを持つイベントとして、Event Delivery Networkに発行されています。

このイベントを発行することによって生じる効果を見る前に、CustomerIdentifier Composite Sensorからの値をXYZでフィルタリングした実行中のインスタンスの概要を見てみましょう(図44)。これにより、何が起こるか予想がつくと思います。記載されているこの5個のインスタンスは、終了しているはずです。
図44

Inspecting the event consequences

EDNにはTerminateCustomerイベントの一つのサブスクライバがあります。それがFanoutEventコンポジットのメディエータConsumeTerminateCustomerです。このMediatorは、顧客XYZのイベントを消費し、SpringコンポーネントのTerminateCustomerToAbortOrderEventTransformerを起動します。このコンポーネントは、顧客XYZに対応する、実行中のすべてのProcessOrderインスタンスを見つけ(図44から少なくとも5個あることがわかります)、特定のOrder IDのために、EDNに対しAbortOrderForCustomerEventを発行するPublishAbortOrderEventメディエータを呼び出します。

メッセージフロートレースの検査時に、いったい何が起こったのかが明確になります。5個の呼び出しはメディエータPublishAbortOrderEventに対してなされました。この結果、5つ実行中の注文に対応するAbortOrderForCustomerイベントになりました。メッセージフロートレースから、これらのイベントのいずれかが、ProcessOrderインスタンスをどのように終了させているかがわかります(図45)。
図45
終了したProcessOrderインスタンスのいずれかをドリルダウンし、BPELの監査証跡を調べると、何が起こったか明確な図を確認できます(図46)。
図46
顧客XYZ(終了したもの)と注文345X(BPELインスタンスが処理した注文)のAbortOrderForCustomerイベントを、orderIdentifierを基にした相関を通じて、このインスタンスが消費しました。このイベントを捕捉するonMessageハンドラは、AbortThisOrderアクティビティを実行し、意図したとおりにBPELインスタンスを中止しました。

当然ながら、他の顧客のためのすべてのProcessOrderインスタンスは、この時点では実行されています。顧客XYZを扱うものだけが終了しました。

Conclusion

ビジネスイベントを使用すると、組織は、新しいいレベルの疎結合を導入することができます。潜在的に興味深いものと認識されている状況にある任意のパーティー(システム、サービス、アプリケーション、プロセス)は、汎用的なイベントハンドラーに対してイベントを発行することで世間に伝える必要があります。これらの認識されているビジネスイベントの一つ以上に関心を持つ当事者は、イベント発生時に、通知するイベントハンドラを購読することができます。イベントのコンシューマやパブリッシャがお互いについて何も知らないにもかかわらず、曲がりなりにもまだ協力しています。

Oracle SOA SuiteのEvent Delivery Networkはイベントハンドラの一例です。その他もご利用いただけますし、JMSやAQを含めて、比較的単純な手段を使って作成することができます。

ビジネスイベントは、例えば、BPMやBPELといった実行中のプロセスに影響を与える必要がある場合、こうしたイベントを特定のコンポジットインスタンスと相関を持たせる必要があります。しかし、ビジネスイベントが意図された効果とは異なるレベルにあるとき、例えば顧客のすべての注文を停止するような場合、私たちは課題に直面します。通常は、実行中の一つのプロセスインスタンスと相関を構成します。

この記事では、イベントをより高いレベルで捕捉し、期待するレベルの実行中のインスタンスにイベントを発行できることをご説明しました。Composite Sensor、Springコンポーネント、相関を持つインスタンスを発見するためのOracle SOA SuiteのJava API、そして、2番目のタイプの適切なレベルに調整したイベントを使って実施しています。

Resources