2012年6月29日

[Java] Hands-on GlassFish FREE Course covering Deployment, Class Loading, Clustering, etc.

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

Oracle ACE Directorであり、middlewaremagic.comで多くのエントリを執筆しているブロガーであるRene van Wijk がGlassFishの無償ハンズオンコースのコンテンツを共有してくれています。
middlewaremagic.com
http://middlewaremagic.com/
Free GlassFish Server Course
http://middlewaremagic.com/weblogic/?p=8009
このコースはGlassFishの内部構造、JVMのチューニング、デプロイ、クラスローディング、セキュリティ、リソースの構成、クラスタリングの概要を範囲としています。
GlassFish Server ()
https://www.dropbox.com/sh/f5orcs55g7j57oj/GaVmqk2A5d/GlassFishServer/glassfish-sheets.pdf

自習のためのハンズオン教材を使って、インストール、設定、デプロイ、チューニングの手順や、アプリケーション開発およびGlassFishへデプロイする際の局面での方法を知って下さい。マテリアルはこちらからどうぞ。

このコースには有料かつインストラクターが付くタイプのコースもあります。参加者用にVMが用意されており、Q&Aやディスカッションを十分にして頂けます。有料コースの登録はこちらからどうぞ(訳注:日本では開催されていません)。

Oracle Universityでも同様の有料コース「Oracle GlassFish Server 3.1: Administration and Deploymentを開催しています(訳注:日本のOracle Universityでは開催していません)。
Oracle GlassFish Server 3.1: Administration and Deployment
http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=609&p_org_id=1001&lang=US&get_params=dc:D69508GC10,p_preview:N

2012年6月28日

[Linux] Oracle Linux 6 update 3

原文はこちら。
https://blogs.oracle.com/wim/entry/oracle_linux_6_update_3

オンラインでOracle Linux 6.3チャネルをご利用いただけます。以下の2つのリポジトリからどうぞ。
  • http://public-yum.oracle.com
    ベースチャネルとしても、最新版をダウンロードするためのチャネルとしてもご利用いただけます(無料)
  • http://linux.oracle.com
    カスタマーポータルの背後にあるものですが、ほぼ同じ内容です。
ソースコードのRPMは以下のURLからどうぞ。
Index of /ol6/SRPMS-updates
http://oss.oracle.com/ol6/SRPMS-updates
OL6.3にはUEK2(kernel-uek-2.6.39-200.24.1)が含まれています。ソースコードのRPMは上記URLにありますが、パブリックGITリポジトリにも近いうちにUpされます。
Oracle Unbreakable Enterprise Kernel Release 2 GIT
https://oss.oracle.com/git/?p=linux-uek-2.6.39.git;a=summary
当然ながら他とは違い、完全なソース、完全な変更履歴、完全なチェックイン履歴、メインラインおよびOracle独自のものをご利用頂けます。Webサイトをかけずり回ってかき集める必要はありません。
これとは別に、まもなくやってくるクールなものは、Oracle Linux 6.3のブートISOです。これはUEK2(2.6.39-200.24.1)をインストールカーネルとしてブートし、インストール時のデフォルトファイルシステムとしてbtrfsを使用します。そんなわけで、最新かつ最高のbtrfsを利用でき、十分にテストされた最新のカーネルを自由かつ無料でご利用いただけます。

2012年6月26日

[misc] 世界に通用するエリート・エキスパートの証『Oracle ACE』を手に入れよう!

原文はこちら。
https://blogs.oracle.com/otnjp/entry/%E4%B8%96%E7%95%8C%E3%81%AB%E9%80%9A%E7%94%A8%E3%81%99%E3%82%8B_%E3%82%A8%E3%83%AA%E3%83%BC%E3%83%88_%E3%82%A8%E3%82%AD%E3%82%B9%E3%83%91%E3%83%BC%E3%83%88%E3%81%AE%E8%A8%BC_oracle_ace

OTN Japanでは日本在住の新規Oracle ACEメンバーの応募を募っているそうです。自薦他薦問わず、推薦状も日本語でOKということなので、Evangelist的活動をされている方や、Oracle製品に関するブログなどを書いてらっしゃる、腕に覚えありというエンジニアさんは、是非応募してみて下さい。
詳細は原文(日本語)をどうぞ。

2012年6月25日

[Coherence] Calculating the Size (in Bytes and MB) of a Oracle Coherence Cache

原文はこちら。
https://blogs.oracle.com/middlewareplace/entry/calculating_the_size_of_a

データグリッド(Data Grid)というコンセプト、およびその利用はこのところかなり浸透してきましたが、これはOracle Coherenceのようなクールで先端をいく製品と共にこの手の技術が急速な進化をしているからです。開発者はプログラム的にデータグリッドに存在するデータのサイズを計算する必要が出てきますが、このエントリではOracle Coherence APIを使って実現する方法をご紹介します。このサンプルはOracle Coherence3.6、3.7、3.7.1でテスト済みです。
Oracle Coherence
http://www.oracle.com/technetwork/jp/middleware/coherence/overview/index.html
Oracle Coherence API
http://docs.oracle.com/cd/E24290_01/coh.371/e22837/toc.htm (英語)
http://docs.oracle.com/cd/E26853_01/coh.371/b65026/toc.htm (日本語)
このサンプルを作成するために、ユーザデータを保持するデータ構造を表すPOJOを作る必要があります。では、以下のようなPersonというJavaクラスを作りましょう。
package com.oracle.coherence.domain;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;

@SuppressWarnings("serial")
public class Person implements Serializable {
 
 private String firstName;
 private String lastName;
 private List<Object> fat;
 private String email;
 
 public Person() {
  generateFat();
 }
 
 public Person(String firstName, String lastName,
   String email) {
  setFirstName(firstName);
  setLastName(lastName);
  setEmail(email);
  generateFat();
 }
 
 private void generateFat() {
  fat = new ArrayList<Object>();
  Random random = new Random();
  for (int i = 0; i < random.nextInt(18000); i++) {
   HashMap&lt;Long, Double> internalFat = new HashMap<Long, Double>();
   for (int j = 0; j < random.nextInt(10000); j++) {
    internalFat.put(random.nextLong(), random.nextDouble());
   }
   fat.add(internalFat);
  }
 }
 
 public String getFirstName() {
  return firstName;
 }

 public void setFirstName(String firstName) {
  this.firstName = firstName;
 }

 public String getLastName() {
  return lastName;
 }

 public void setLastName(String lastName) {
  this.lastName = lastName;
 }

 public String getEmail() {
  return email;
 }

 public void setEmail(String email) {
  this.email = email;
 }

}
では、Coherenceでデータグリッドを作成し、Peopleというキャッシュを作るJavaプログラムを作りましょう。このキャッシュで連番のキーを持つ、人の情報を保持します。このプログラムで作られたpersonはそれぞれ、Peopleクラスで作成されたカスタムコンストラクタを起動し、インスタンス化します(オブジェクトのサイズを増やすため、生成されたランダムなデータサイズになっています)。以下のような、"CreatePeopleCacheAndPopulateWithData"というJavaクラスを作成しましょう。
package com.oracle.coherence.demo;

import com.oracle.coherence.domain.Person;
import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;

public class CreatePeopleCacheAndPopulateWithData {

 public static void main(String[] args) {
  
  // Asks Coherence for a new cache named "People"...
  NamedCache people = CacheFactory.getCache("People");
  
  // Creates three people that will be putted into the data grid. Each person
  // generates an internal fat that should increase its size in terms of bytes...
  Person pessoa1 = new Person("Ricardo", "Ferreira", "ricardo.ferreira@example.com");
  Person pessoa2 = new Person("Vitor", "Ferreira", "vitor.ferreira@example.com");
  Person pessoa3 = new Person("Vivian", "Ferreira", "vivian.ferreira@example.com");
  
  // Insert three people at the data grid...
  people.put(1, pessoa1);
  people.put(2, pessoa2);
  people.put(3, pessoa3);
  
  // Waits for 5 minutes until the user runs the Java program
  // that calculates the total size of the people cache...
  try {
   System.out.println("---> Waiting for 5 minutes for the cache size calculation...");
   Thread.sleep(300000);
  } catch (InterruptedException ie) {
   ie.printStackTrace();
  } 
 }
}
最後に、Coherence APIとJMXを使ってデータグリッドが現在管理している各キャッシュの全サイズを計算するJavaプログラムを作成しましょう。このサンプルでは、データグリッドが現在管理しているすべてのキャッシュを取得しましたが、特定のキャッシュに興味があれば、同じやり方で、探しているキャッシュだけをフィルタすることで実現できます。以下のような"CalculateTheSizeOfPeopleCache" というJavaクラスを作成します。
package com.oracle.coherence.demo;

import java.text.DecimalFormat;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;

import com.tangosol.net.CacheFactory;

public class CalculateTheSizeOfPeopleCache {
 
 @SuppressWarnings({ "unchecked", "rawtypes" })
 private void run() throws Exception {
  
        // Enable JMX support in this Coherence data grid session...
 System.setProperty("tangosol.coherence.management", "all");
  
        // Create a sample cache just to access the data grid...
 CacheFactory.getCache(MBeanServerFactory.class.getName());
  
 // Gets the JMX server from Coherence data grid...
 MBeanServer jmxServer = getJMXServer();
        
        // Creates a internal data structure that would maintain
 // the statistics from each cache in the data grid...
 Map cacheList = new TreeMap();
        Set jmxObjectList = jmxServer.queryNames(new ObjectName("Coherence:type=Cache,*"), null);
        for (Object jmxObject : jmxObjectList) {
            ObjectName jmxObjectName = (ObjectName) jmxObject;
            String cacheName = jmxObjectName.getKeyProperty("name");
            if (cacheName.equals(MBeanServerFactory.class.getName())) {
             continue;
            } else {
             cacheList.put(cacheName, new Statistics(cacheName));
            }
        }
        
        // Updates the internal data structure with statistic data
        // retrieved from caches inside the in-memory data grid...
        Set<string> cacheNames = cacheList.keySet();
        for (String cacheName : cacheNames) {
            Set resultSet = jmxServer.queryNames(
             new ObjectName("Coherence:type=Cache,name=" + cacheName + ",*"), null);
            for (Object resultSetRef : resultSet) {
                ObjectName objectName = (ObjectName) resultSetRef;
                if (objectName.getKeyProperty("tier").equals("back")) {
                    int unit = (Integer) jmxServer.getAttribute(objectName, "Units");
                    int size = (Integer) jmxServer.getAttribute(objectName, "Size");
                    Statistics statistics = (Statistics) cacheList.get(cacheName);
                    statistics.incrementUnit(unit);
                    statistics.incrementSize(size);
                    cacheList.put(cacheName, statistics);
                }
            }
        }
        
        // Finally... print the objects from the internal data
        // structure that represents the statistics from caches...
        cacheNames = cacheList.keySet();
        for (String cacheName : cacheNames) {
            Statistics estatisticas = (Statistics) cacheList.get(cacheName);
            System.out.println(estatisticas);
        }
        
    }

    public MBeanServer getJMXServer() {
        MBeanServer jmxServer = null;
        for (Object jmxServerRef : MBeanServerFactory.findMBeanServer(null)) {
            jmxServer = (MBeanServer) jmxServerRef;
            if (jmxServer.getDefaultDomain().equals(DEFAULT_DOMAIN) || DEFAULT_DOMAIN.length() == 0) {
                break;
            }
            jmxServer = null;
        }
        if (jmxServer == null) {
            jmxServer = MBeanServerFactory.createMBeanServer(DEFAULT_DOMAIN);
        }
        return jmxServer;
    }
 
    private class Statistics {
  
        private long unit;
        private long size;
        private String cacheName;
  
 public Statistics(String cacheName) {
            this.cacheName = cacheName;
        }

        public void incrementUnit(long unit) {
            this.unit += unit;
        }

        public void incrementSize(long size) {
            this.size += size;
        }

        public long getUnit() {
            return unit;
        }

        public long getSize() {
            return size;
        }

        public double getUnitInMB() {
            return unit / (1024.0 * 1024.0);
        }

        public double getAverageSize() {
            return size == 0 ? 0 : unit / size;
        }

        public String toString() {
            StringBuffer sb = new StringBuffer();
            sb.append("\nCache Statistics of '").append(cacheName).append("':\n");
            sb.append("   - Total Entries of Cache -----> " + getSize()).append("\n");
            sb.append("   - Used Memory (Bytes) --------> " + getUnit()).append("\n");
            sb.append("   - Used Memory (MB) -----------> " + FORMAT.format(getUnitInMB())).append("\n");
            sb.append("   - Object Average Size --------> " + FORMAT.format(getAverageSize())).append("\n");
            return sb.toString();
        }

    }
 
    public static void main(String[] args) throws Exception {
 new CalculateTheSizeOfPeopleCache().run();
    }
 
    public static final DecimalFormat FORMAT = new DecimalFormat("###.###");
    public static final String DEFAULT_DOMAIN = "";
    public static final String DOMAIN_NAME = "Coherence";

}
サンプル全体にコメントをしてきたので、理解に困るところはないと思います。基本的に、今回はJMXを使っています。まずやるべきことはCoherenceクライアントアプリケーションに対するJMXのサポートを有効にすることです(つまり、JVMがデータグリッドからのみ値を取り出し、クラスタに統合しないということです)。これは、"tangosol.coherence.management"というランタイムシステムプロパティを使えば簡単に実現できます。CoherenceのJMXに関するドキュメントを読んで、取り出せる値をチェックしておいて下さい。このプログラムではStatisticsというカスタムクラスを保持するインメモリデータ構造を作成します。
このクラスは見たい情報、この場合、キャッシュのバイト数、メガバイト数を表します。このクラスのインスタンスを、現在データグリッドで管理しているキャッシュの各々に対して作成します。JMXの特定のメソッドを使うと、キャッシュの全サイズを計算する上で使える情報を取り出すことができます。このサンプルをテストするため、まずCreatePeopleCacheAndPopulateWithData.java を実行し、その後CalculateTheSizeOfPeopleCache.javaを実行しましょう(訳注:原文はCreatePeopleCacheAndPopulateWithData.javaを2回呼ぶことになっていますが、書き換えています)。コンソールに現れる結果は以下のような感じになります。
2012-06-23 13:29:31.188/4.970 Oracle Coherence 3.6.0.4 <info> (thread=Main Thread, member=n/a): Loaded operational configuration from "jar:file:/E:/Oracle/Middleware/oepe_11gR1PS4/workspace/calcular-tamanho-cache-coherence/lib/coherence.jar!/tangosol-coherence.xml"
2012-06-23 13:29:31.219/5.001 Oracle Coherence 3.6.0.4 <info> (thread=Main Thread, member=n/a): Loaded operational overrides from "jar:file:/E:/Oracle/Middleware/oepe_11gR1PS4/workspace/calcular-tamanho-cache-coherence/lib/coherence.jar!/tangosol-coherence-override-dev.xml"
2012-06-23 13:29:31.219/5.001 Oracle Coherence 3.6.0.4 <d5> (thread=Main Thread, member=n/a): Optional configuration override "/tangosol-coherence-override.xml" is not specified
2012-06-23 13:29:31.266/5.048 Oracle Coherence 3.6.0.4 <d5> (thread=Main Thread, member=n/a): Optional configuration override "/custom-mbeans.xml" is not specified

Oracle Coherence Version 3.6.0.4 Build 19111
 Grid Edition: Development mode
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

2012-06-23 13:29:33.156/6.938 Oracle Coherence GE 3.6.0.4 <info> (thread=Main Thread, member=n/a): Loaded Reporter configuration from "jar:file:/E:/Oracle/Middleware/oepe_11gR1PS4/workspace/calcular-tamanho-cache-coherence/lib/coherence.jar!/reports/report-group.xml"
2012-06-23 13:29:33.500/7.282 Oracle Coherence GE 3.6.0.4 <info> (thread=Main Thread, member=n/a): Loaded cache configuration from "jar:file:/E:/Oracle/Middleware/oepe_11gR1PS4/workspace/calcular-tamanho-cache-coherence/lib/coherence.jar!/coherence-cache-config.xml"
2012-06-23 13:29:35.391/9.173 Oracle Coherence GE 3.6.0.4 <d4> (thread=Main Thread, member=n/a): TCMP bound to /192.168.177.133:8090 using SystemSocketProvider
2012-06-23 13:29:37.062/10.844 Oracle Coherence GE 3.6.0.4 <info> (thread=Cluster, member=n/a): This Member(Id=2, Timestamp=2012-06-23 13:29:36.899, Address=192.168.177.133:8090, MachineId=55685, Location=process:244, Role=Oracle, Edition=Grid Edition, Mode=Development, CpuCount=2, SocketCount=2) joined cluster "cluster:0xC4DB" with senior Member(Id=1, Timestamp=2012-06-23 13:29:14.031, Address=192.168.177.133:8088, MachineId=55685, Location=process:1128, Role=CreatePeopleCacheAndPopulateWith, Edition=Grid Edition, Mode=Development, CpuCount=2, SocketCount=2)
2012-06-23 13:29:37.172/10.954 Oracle Coherence GE 3.6.0.4 <d5> (thread=Cluster, member=n/a): Member 1 joined Service Cluster with senior member 1
2012-06-23 13:29:37.188/10.970 Oracle Coherence GE 3.6.0.4 <d5> (thread=Cluster, member=n/a): Member 1 joined Service Management with senior member 1
2012-06-23 13:29:37.188/10.970 Oracle Coherence GE 3.6.0.4 <d5> (thread=Cluster, member=n/a): Member 1 joined Service DistributedCache with senior member 1
2012-06-23 13:29:37.188/10.970 Oracle Coherence GE 3.6.0.4 <info> (thread=Main Thread, member=n/a): Started cluster Name=cluster:0xC4DB

Group{Address=224.3.6.0, Port=36000, TTL=4}

MasterMemberSet
  (
  ThisMember=Member(Id=2, Timestamp=2012-06-23 13:29:36.899, Address=192.168.177.133:8090, MachineId=55685, Location=process:244, Role=Oracle)
  OldestMember=Member(Id=1, Timestamp=2012-06-23 13:29:14.031, Address=192.168.177.133:8088, MachineId=55685, Location=process:1128, Role=CreatePeopleCacheAndPopulateWith)
  ActualMemberSet=MemberSet(Size=2, BitSetCount=2
    Member(Id=1, Timestamp=2012-06-23 13:29:14.031, Address=192.168.177.133:8088, MachineId=55685, Location=process:1128, Role=CreatePeopleCacheAndPopulateWith)
    Member(Id=2, Timestamp=2012-06-23 13:29:36.899, Address=192.168.177.133:8090, MachineId=55685, Location=process:244, Role=Oracle)
    )
  RecycleMillis=1200000
  RecycleSet=MemberSet(Size=0, BitSetCount=0
    )
  )

TcpRing{Connections=[1]}
IpMonitor{AddressListSize=0}

2012-06-23 13:29:37.891/11.673 Oracle Coherence GE 3.6.0.4 <d5> (thread=Invocation:Management, member=2): Service Management joined the cluster with senior service member 1
2012-06-23 13:29:39.203/12.985 Oracle Coherence GE 3.6.0.4 <d5> (thread=DistributedCache, member=2): Service DistributedCache joined the cluster with senior service member 1
2012-06-23 13:29:39.297/13.079 Oracle Coherence GE 3.6.0.4 <d4> (thread=DistributedCache, member=2): Asking member 1 for 128 primary partitions

Cache Statistics of 'People':
   - Total Entries of Cache -----> 3
   - Used Memory (Bytes) --------> 883920
   - Used Memory (MB) -----------> 0.843
   - Object Average Size --------> 294640
このエントリが、データグリッドを使う高拡張性を求められるシステムで、Coherenceのキャッシュサイズを計算する手間を省くお役に立つことを願っています。

2012年6月22日

[NoSQL] Oracle NoSQL Database Using FusionIO ioDrive2

原文はこちら。
https://blogs.oracle.com/charlesLamb/entry/oracle_nosql_database_using_fusionio

FusionIO ioDrive2 SSDドライブとOracle NoSQL Databaseを使ってベンチマークテストを実施しました。FusionIOがベンチマーク結果をホワイトペーパにして発行しています。
Oracle NoSQL Database and Fusion's ioDrive2 Offer Cost-effective, Extreme Performance for Big Data
http://www.fusionio.com/white-papers/oracle-nosql-database-and-fusions-iodrive2-offer-cost-effective-extreme-performance-for-big-data
一部引用すると…
テストの結果、ioDrive2を使うと、90%読み込み、10%書き込みのワークロードでは、300GB 10k SASディスクで秒間30倍近く処理性能が向上することがわかりました。また、50%読み込み、50%書き込みのワークロードでは、ほぼ8倍の処理性能向上が見られました。同様に印象的だったのは、ioDrive2を使うと、90%読み込み、10%書き込みのワークロードにおけるinsert処理で、レイテンシが700%(7倍)以上削減し、50%読み込み、50%書き込みのワークロードでは、5800%(58倍)以上もレイテンシを削減したことです。

2012年6月21日

[ADF] Free Advanced ADF eCourse, part II

原文はこちら。
https://blogs.oracle.com/jdevotnharvest/entry/free_advanced_adf_ecourse_part

A second part of the advanced Oracle ADFオンライントレーニングの第2部が無料でご利用頂けます。Lynn Munsingerとそのチームが、出来るだけ第1部と間をあけずにこの第2部をお届けするできるように頑張ってくれました。このADFトレーニングで高度なADFのノウハウをお届けすると共に、個人のペースで学習して頂けるようにしています。

2012年6月18日

[JavaFX] Native packaging for JavaFX

原文はこちら。
https://blogs.oracle.com/talkingjavadeployment/entry/native_packaging_for_javafx

JavaFX 2.2にはJavaFXアプリケーション用の新しいパッケージングオプションが追加されています。これによりネイティブ形式としてアプリケーションをパッケージングできます。この方法を使えば、外部依存(JREやJavaFX SDKなど)は関係なくアプリケーションをインストールし、実行できます。このエントリでは概要とこの機能が導入された背景、そして入門編をご紹介します。

スクリーンショットからユーザーエクスペリエンスのアイデアが浮かぶかもしれませんが、まずは最初の実体験が肝心です。詳細の説明に入る前に、exe、msi、dmg、rpmインストーラーとrpmが使えないLinuxバンドルのzipといった、Ensemble間の微妙な違いを示しておきます。代わりに、JFxtras 2のネイティブパッケージをチェックしてみましょう。
Ensemble
exe形式:http://java.net/downloads/jdk7/deploy/samples/native-bundles/win/Ensemble2-1.0.exe
msi形式:http://java.net/downloads/jdk7/deploy/samples/native-bundles/win/Ensemble2.msi
dmg形式:http://java.net/downloads/jdk7/deploy/samples/native-bundles/mac/Ensemble2.dmg
rpm形式:http://java.net/downloads/jdk7/deploy/samples/native-bundles/linux/Ensemble2-1.0-1.i686.rpm
Zip形式:http://java.net/downloads/jdk7/deploy/samples/native-bundles/linux/Ensemble2.zip

JFXtras 2
http://jfxtras.org/


今までのデプロイメントオプションに何か問題でも?
JavaFX 2アプリケーションは、スタンドアプリケーションとして配布したり、Webにデプロイされたアプリケーション(Webページへの埋め込みもしくはWebページからアプリケーションを起動するリンクとして)として簡単に配布できます。JavaFXパッケージングツールはantタスクやjavafxpackagerユーティリティのようなものですが、これを使うとデプロイメントパッケージの作成がずっと簡単です。なぜ新たなデプロイ方法を追加したのでしょうか。
JavaFXパッケージングツール
http://docs.oracle.com/javafx/2/deployment/deploy_overview.htm#BABCGDJF
JavaFXアプリケーションには暗黙のうちにJavaやJavaFXランタイムへの依存性があり、既存のデプロイ方法がシステム要件に合うことを検証する手段を提供し、ユーザにインストールやアップグレードが必要であることをガイドするのに対し、このパッケージング方法では重要なシナリオの全てに対応しているわけではありません。特に、こんな例です。
  • 新しいシステムソフトウェアをインストールするための管理者権限を、そのユーザが持っていない場合。
  • アプリケーションが特定の環境 (Java、JavaFXのバージョン固定)での実行が保証されている場合に、 (環境をセキュアにするため)JavaやJavaFXのシステムバージョンの自動アップデートにより、 ユーザがこの環境を保持することが困難な場合がある。場合によっては、他のアプリが異なるJREやJavaFXの要件を持っており、対象となるアプリと相容れない可能性がある。
  • 配布チャネルが外部フレームワークへの依存を許可しない場合(例えばMacのAppStore)
JavaFXアプリケーション向けの"native package"って何者?
手短に言うと、こんな感じです。
  • JavaFXアプリケーションをプラットフォーム固有のアプリケーションバンドルにまとめるためのラッパー
  • 各バンドルは自己完結しており、以下のものを含む。
    • アプリケーションコードとリソース(スタンドアロンアプリケーションをjarから起動する際に必要なものと同じ)
    • JavaとJavaFXランタイム(このアプリケーションでの利用に限定したプライベートコピー)
    • ネイティブアプリケーションランチャ
    • メタデータ(アイコンなど)
  • JavaやJavaFXランタイムの個別インストールは不要
  • zipファイルやプラットフォーム固有のインストーラとしてパッケージされているもの
  • アプリケーションの変更はなく、同じjarのアプリケーションバイナリをネイティブバンドル、ダブルクリック可能なjar、web startアプリとしてデプロイできる。
長所
  • 新しいシステムへの アプリケーションインストールが簡単。zipもしくはユーザレベルのインストーラを使用する場合、管理者権限は不要。
  • 互換性を考慮する必要がない場合。アプリケーションは、JavaとJavaFXのプライベートコピーを使っており、開発者が、更新タイミングをコントロールする。
  • MacのAppStore(またはWindows、その他)用にアプリケーションを簡単にパッケージングする。
  • 実行するアプリケーションのプロセス名を (単にjava.exeではなく) アプリケーションにちなんで命名する。
  • エンタープライズデプロイメントツールを使って簡単にアプリケーションをデプロイする(例えばMSIとしてデプロイ)
  • サポートはJDK 7u6に組み込み(JavaFX 2.2を含む)
このデプロイ方法を追加した結果、他のデプロイ方法が廃止になるのでしょうか。いいえ、JavaFXがサポートする他のデプロイ方法を廃止する予定はありません。各方法は異なる要件に対応しているからです。どのネイティブパッケージング方法がjavaFXアプリケーションにとって最適かを決定するのは、要件次第です。
考慮すべき注意事項をいくつか。
  • 「ダウンロードして実行」というユーザーエクスペリエンス
    Webデプロイメントとは異なり、ユーザエクスペリエンスは「Webからアプリを起動」するものとは異なり、「ダウンロード、インストール、実行」プロセスなので、ユーザはアプリケーションを起動するために追加の手順が必要になることがあります。例えばブラウザセキュリティダイアログを許可したり、アプリケーションインストーラを「ダウンロード」フォルダから見つけ、実行するといったことがらです。
  • ダウンロードサイズが大きい
    一般に、バンドルされたアプリケーションのサイズはバンドルされていないアプリケーションよりも著しく大きくなりますが、これはJREやJavaFXのプライベートコピーが含まれているからです。圧縮やカスタマイズ可能なトリミングなどでサイズを小さくしようとしていますが、常にシステム上のJREに依存するアプリケーションに比べて十分大きなサイズになります。
  • ターゲットプラットフォーム毎のバンドル
    バンドルフォーマットはプラットフォーム固有です。現在はネイティブバンドルをアプリケーションを作成している同一システム向けにのみ作成できます。これはつまり、Windows、Linux、Macのネイティブバンドルを提供したい場合、各3プラットフォームでビルドしなければなりません。
  • アプリケーションのアップデートは開発者の責務
    WebデプロイされたJavaアプリケーションは、 利用可能になった時点で速やかに、更新版をWebから自動的にダウンロードします。Java Autoupdateメカニズムは年に数回最新のセキュアなバージョンにJavaとJavaFXランタイムをアップグレードします。バンドルされたアプリケーションではこの機構のサポートは含まれていません。3rdパーティのライブラリ(例えばMacにおけるSparkle)を使い、アプリケーションレベルで自動更新のサポートを追加することが可能です。 JavaFXの将来のバージョンでは自動更新のビルトインサポートを組み込む予定です。 (ご興味あるようなら、RT-22211を追跡されることをお勧めします)
    Add ability to automatically update co-bundled app
    http://javafx-jira.kenai.com/browse/RT-22211
ネイティブバンドルを始めてみよう
まず、最新のJDK 7u6ベータビルド(build 14以後を推奨)を入手する必要があります。
Java™ Platform, Standard Edition 7 Update 6 Developer Preview Releases
http://jdk7.java.net/download.html
Windows/Mac/LinuxではJavaFX 2.2 SDKがJDKインストーラに付属しており、この中にJavaFXパッケージングツールが含まれています。
  • bin/javafxpackager
    JavaFXパッケージ生成のコマンドラインユーティリティ
  • lib/ant-javafx.jar
    JavaFXパッケージを生成するためのantタスクのセット(アプリケーションデプロイにおいて最も推奨される方法)
利用方法に関する一般的な情報は、Deploying JavaFX Application Guideを参照して下さい。
Deploying JavaFX Applications
http://docs.oracle.com/javafx/2/deployment/jfxpub-deployment.htm
このツールを使って、他のデプロイメント用にJavaFXアプリケーションをパッケージする方法を知っていれば、ちょっとした微調整だけでネイティブバンドルを生成できます。
  • インストール済みのJDK7u6バンドルからのJavaを使っていることを確認する
    • 必要であれば、PATHの設定を調整する
  • antタスクを使っているのであれば、
    • fx:deployタスクにnativeBundles=all属性を追加
  • javafxpackagerを使っている場合
    • -nativeオプションをデプロイコマンドに渡す
    • もしくは、makeallコマンドを使っているなら、デフォルトでネイティブパッケージを作成しようとする
  • 生成されたバンドルは他のデプロイメントアーティファクトと並んでbundleフォルダに格納されている
注意頂きたいのは、ネイティブパッケージ(exeやmsiなど)の種類により、3rdパーティ製ソフトウェアのインストールが必要になったり、PATHに通す必要があります。
JDK7u6 build 14の段階では、以下のパッケージタイプを利用できます。
  • Windows:
    • バンドルイメージ
    • EXE:
      • Inno Setup 5以後が必要
        Inno Setup
        http://www.jrsoftware.org/isdl.php
      • 生成されたexeはユーザレベルインストーラとして機能する(インストールに管理者権限は不要)
      • 少なくとも一つのショートカットがメニューもしくはデスクトップに作成される
      • アプリケーションはインストール終了時に起動される
    • MSI:
      • WiX(Windows Installer XML) 3.0以後が必要。
        Windows Installer XML (WiX) toolset
        http://wix.sourceforge.net/
      • 生成されたMSIはユーザレベルインストーラとして機能する(インストールに管理者権限は不要)
      • 少なくとも一つのショートカットがメニューもしくはデスクトップに作成される
  • MacOS:
    • バンドルイメージ
    • dmg (ドラッグ&ドロップ)インストーラ
  • Linux:
    • バンドルイメージ
    • rpm
      • rpmbuildが必要
      • プログラムメニューにショートカットを追加
NetBeansを使ってデプロイメントパッケージを作っているのであれば、カスタムビルドステップをbuild.xmlに追加して、ネイティブバンドルが有効になるようfx:deployタスクを実行する必要があります。以下はBrickBreakerというサンプルのbuild.xmlの一部です。
<target name="-post-jfx-deploy">
    <fx:deploy width="${javafx.run.width}" height="${javafx.run.height}" 
               nativeBundles="all"
               outdir="${basedir}/${dist.dir}" outfile="${application.title}">
        <fx:application name="${application.title}" mainClass="${javafx.main.class}">
             <fx:resources>
                 <fx:fileset dir="${basedir}/${dist.dir}" includes="BrickBreaker.jar"/>
             </fx:resources>
             <info title="${application.title}" vendor="${application.vendor}"/>
        </fx:application>
    </fx:deploy>          
</target>
これはfx:deployタスクのきわめて一般的な使い方ですが、ここでの唯一の特記部分はnativeBundles="all"です。ネイティブ版取りの作成を試す上でおそらく一番簡単な方法は最新のJavaFXのサンプルバンドルをダウンロードして、Ensemble、BrickBreakerもしくはSwingInteropをビルドすることでしょう。
JavaFX and Scene Builder Developer Preview Download
http://www.oracle.com/technetwork/java/javafx/downloads/devpreview-1429449.html
是非試して頂き、あなたの体験を伝えて下さい。あなたからのフィードバックが大切なのです。
ところで、バグ登録やJavaFXバグデータベースへの追加機能リクエストもよろしくお願いします。
JavaFX bug database
http://javafx-jira.kenai.com/

待って!ではどうしたらいいの?
このエントリはネイティブバンドルへの包括的なガイドではないので、このトピックについてエントリを投稿する予定ですが、ネイティブバンドルを使ってみるとたくさんの質問事項が出てくるはずです。全ての質問にはお答えできませんが、是非質問をお寄せ下さい。あらゆる質問を知ることが回答を見つける最初のステップですのでね。

2012年6月17日

[Java] Java Tutorials Update

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

Java Tutorialが新しくなりました。このたび、再構成したGenericsのチュートリアルを追加しています。
Java Tutorials
http://docs.oracle.com/javase/tutorial/index.html
Java TutorialのGenerics
http://docs.oracle.com/javase/tutorial/java/generics/
ダウンロード可能なチュートリアルコンテンツや、Genericsのチュートリアルを含むjavatrail.mobi eBookも新しくなっています。javatrail.epub は今月末をめどに改訂される予定です。チュートリアルのダウンロードは以下のリンクからどうぞ。
Java SE Tutorial 2012-02-28
http://www.oracle.com/technetwork/java/javase/downloads/java-se-7-tutorial-2012-02-28-1536013.html 

2012年6月15日

[Java] Java 7 Update 5 and Java 6 Update 33 have released!

原文はこちら。
https://blogs.oracle.com/javase/entry/java_7_update_5_and

Java SE 7u5とJava 6u33がダウンロード出来るようになりました。
Java SE Downloads
http://www.oracle.com/technetwork/java/javase/downloads/index.html
このリリースにはセキュリティエンハンスメントやバグ修正が含まれています。詳細はリリースノートをご覧下さい。
[7u5] Release Notes
http://www.oracle.com/technetwork/java/javase/7u5-relnotes-1653274.html
[6u33] Release Notes
http://www.oracle.com/technetwork/java/javase/6u33-relnotes-1653258.html

2012年6月10日

[misc] Save 10% when you by this Java mascot stress toy

原文はこちら。 https://blogs.oracle.com/hinkmond/entry/save_10_when_you_by

そうなんです。Javaオンラインショッピングをされる方、注目ですよ。ブルーライトスペシャルを限定期間。ふわふわのDukeでストレスを解消して10%引きのメリットをゲットしましょう。詳しくは、こちらからどうぞ。
Java mascot stress toy
http://oracle.corpmerchandise.com/ProductDetail.aspx?did=14612&pid=87280
Webサイトの引用はこちら。
ポリフォームのストレス解消おもちゃはJavaのマスコットDukeに似せています。
[サイズ]
2-1/4" x 3-1/2"  x 1-3/4". カスタムモールド。
[色]
赤×白×黒
ストレス解消のおもちゃですって?Javaテクノロジーのファンならストレスでいらいらすることはありませんよね。(いらいらするって)答えちゃだめですよ。

2012年6月9日

[Java] JAX-RS 2.0 Early Draft - Third Edition Available

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

JAX-RS 2.0 Early Draftの第3版をご覧頂けます。
JSR-000339 The JavaTM API for RESTful Web Services 2.0
(Close of Early Draft Review 3: 5 July 2012)
jcp.org/aboutJava/communityprocess/edr/jsr339/index3.html
このアップデートされたドラフトには、content-negotiation、プロバイダの発見、クライアントサイドAPI、フィルタ、およびエンティティ・インターセプタやその他のセクションの機能や内容を理解頂くための新しいサンプルが含まれています。フィードバックは users@jax-rs-spec までよろしくお願いします。
JAX-RS 2.0の参照実装(Reference Implementation)であるJersey 2.0が、4個目のマイルストンに先日到達しました。
Jersey 2.0-m04 has been released (Marec Potociar)
http://marek.potociar.net/2012/05/17/jersey-2-0-m04-has-been-released/
いくつかの機能が既に実装済みです。これは早期開発者向けプレビューであり、いくつかのAPIはまだ改良中であることにご注意下さい。
試してみたくなりました?もしそうなら、Maven Centralに行って下さい(当然ながらこの時点では製品レベルの品質ではありません)。
Central Repository > org.glassfish.jersey
http://search.maven.org/#search%7Cga%7C1%7Corg.glassfish.jersey
最新のJAX-RSのJavadocとJersey 2.0 APIのJavadocを使って調査を始めてもらうのがよいかと思います。フィードバックは users@jersey.java.net もしくは @gf_jersey に対するmentionでお願いします。

2012年6月8日

[Social] Oracle Social Network in the Cloud - the videos

原文はこちら。
https://blogs.oracle.com/peterreiser/entry/oracle_social_network_in_the

6月6日、Larry Ellisonは業界で最も広範なクラウド戦略を発表しました。
Oracle Unveils Industry’s Broadest Cloud Strategy
https://blogs.oracle.com/webcenter/entry/oracle_unveils_industry_s_broadest
Webcast
http://www.oracle.com/goto/strategyupdate
As part of the OracleのCloudに関する発表の中で、LarryはOracle Cloud Social Servicesを発表しました。これは今日のクラウドで利用可能なもののうち、最も広範かつ完全なエンタープライズ向けソーシャルプラットフォームです。これらのサービスってどんなのよ、って思ってらっしゃることでしょう。以下にOracle Social Networkを使っている動画をお届けします。

Connect with Oracle Social Network


Oracle Social Network: Getting Started


Oracle Social Network: Conversation Basics


Oracle Social Network: Notifications and Preferences


Oracle Social Network: Basics of Chats

[VDI, Exalogic] Introducing Oracle Secure Global Desktop for Exalogic!

原文はこちら。
https://blogs.oracle.com/virtualization/entry/introducing_oracle_secure_global_desktop

Oracle Secure Global Desktop for Exalogicを発表できることをうれしく思います。Exalogicはengineered systemとして、Javaアプリケーション、Oracle Applications、その他のエンタープライズアプリケーションの性能を極限まで高めます。Oracle Secure Global Desktopはアプリーションが稼働するサーバへのアクセスを一元管理し、様々なクライアントデバイスからのセキュアなアクセスを提供します。Mohamad AfsharとOracleのProduct Managementを担当するMohan Prabhalaの会話をご覧頂き、Oracle Secure Global Desktopとは何なのか、その差別化要素、Exalogicとの関係について知って頂ければと思います。

[Tuxedo] Tuxedo Load Balancing

原文はこちら。
https://blogs.oracle.com/Tuxedo/entry/tuxedo_load_balancing

よく頂く質問に、「Tuxedoはどうやって負荷分散するの?」というのがあります。この質問は、特定のサービスを提供しているサーバが捌くリクエストの件数にばらつきがあることを知っているお客様からよく頂きます。
まず、Tuxedoは負荷分散するのではなく、リクエストや負荷の最適化をやっています。言わんとすることは、Tuxedoは特定のサービスを提供する全てのサーバが同じ件数のリクエストを受け取っていることを保証しようとはしておらず、その代わりに最小の時間でリクエストが処理されることを保証しようとしています。シンプルなラウンドロビンの負荷分散を使って特定のサービスのサーバ全てに同じ件数のリクエストを渡すことを保証できるでしょうが、それになんのメリットがあるのでしょうか。
Tuxedoではその代わりに、Queue(SSSQ*やMSSQ**に基づきサーバに対応している場合とサーバに対応していない場合があります)をスキャンして、どのQueueにリクエストを配置すべきかを決定します。
SSSQ : Single Server Single Queue
MSSQ : Multiple Server Single Queue
常に同じ順序でスキャンを実施し、Queueが空の場合はリクエストを即座にそのQueueに配置してリクエストのルーティングを終了します。しかし、全てのQueueが詰まっている場合(リクエストが現在処理中の場合)、TuxedoはWorkリクエスト件数が最小のQueueを選択してリクエストをEnqueueします。ここでworkとは、UBBCONFIGファイルで定義されている「負荷」の値で重み付けされてQueueに入れられた全てのリクエストの合計です。これは軽い負荷であれば、スキャン完了までに空のQueueが見つかることが多いので、最初にスキャンした数個のQueue(サーバ)で全てのリクエストを処理することを意味します。したがって、最初にスキャンしたキュー内のサーバ数個で、ほとんどのリクエストを処理します。最適化されていないように思えますが、実際には、基礎となるオペレーティングシステムおよびハードウェアを十分に活用して、可能な限り最高のパフォーマンスを生成しています。ラウンドロビンスケジューリングを使うと使用可能なすべてのサーバーへリクエストを散らすため、すべてのリクエストがメモリに存在する必要があり、おそらくハードウェアやメモリのキャッシュの方法で多くを共有しないでしょう。Tuxedoのシステムは種々のキャッシュを最大化し、その結果全体のパフォーマンスを最適化します。

このことが、ほとんどのリクエストを数個のサーバで処理している状況を目の当たりにする理由を説明しています。高負荷、つまり、リクエストを処理する全てのサーバに十分な負荷がかかり続けている場合、処理されたリクエスト件数はほぼ均等になることがわかると思います。
次回のエントリでは、クラスタ環境(MP)では負荷分散が少々複雑になるので、クラスタ環境のサーバに適用する方法を取り扱う予定です。

[WebCebter] Configuring the iPlanet as web tier for Oracle WebCenter Content (UCM)

原文はこちら。
https://blogs.oracle.com/ATEAM_WEBCENTER/entry/configuring_the_iplanet_as_web

Oracle WebCenter Contentを利用する際にiPlanetをWebサーバ/プロキシサーバとして利用した場合、参照できるドキュメントが見当たらないか、10gR3用の古い複雑なNoteが見つかるだけかと思いますので、このエントリで手順を追って説明します。
以下は、クラスタ構成の本番環境にデプロイする上で検討しなえればならない、タスクシナリオの図です。

必要なソフトウェアは…
  • Oracle iPlanet Web Server 7.0.15+ (インストール済み)
  • Oracle WebCenter Content 11gR1 PS5 (インストール済み)
  • Oracle WebLogic Web Server Plugins 11g (1.1)
  • サポートされているJDK (今回はOracle Java JDK 7u4を使用)
  • 動作保証されているクライアントOS
  • 動作保証されているサーバOS (今回はOracle Solaris 11を使用)
  • 動作保証されているデータベース(今回はOracle Database 11.2.0.3を使用)
では設定してきます。
  • 最新のプラグインをダウンロードします
    http://www.oracle.com/technetwork/middleware/ias/downloads/wls-plugins-096117.html
  • WLSPlugin11g-iPlanet7.0を展開します(例:<iPlanet_Home>/plugins/wls11)
  • プラグインの参照をmagnus.confに設定します
    • Unix (SolarisやLinux)の場合、以下の行を追記します。
      Init fn="load-modules" shlib="/apps/oracle/WebServer7/plugins/wls11/lib/mod_wl.so"
      
    • Windowsの場合、以下の行を追記します。
      Init fn="load-modules" Init fn="load-modules" shlib="D:\\oracle\\WebServer7\\plugins\\wls11\\lib\\mod_wl.dll"
      
  • プロキシの参照を各インスタンスのobj,confに追加します。
     Service fn="wl-proxy" WebLogicCluster="wcc-node1:16201,wcc-node2:16202, wcc-node3:16203"  
    
     Service fn="wl-proxy" WebLogicCluster="wcc-node1:16201,wcc-node2:16202, wcc-node3:16203"  
    
     Service fn="wl-proxy" WebLogicCluster="wcc-node1:16201,wcc-node2:16202, wcc-node3:16203"  
    
     Service fn="wl-proxy" WebLogicCluster="wcc-node1:16201,wcc-node2:16202, wcc-node3:16203" 
    
    単一ノードのセットアップをしている場合、"Service fn=…"の行を以下のように変更して下さい。
    Service fn="wl-proxy" WebLogicHost={wcc-server} WebLogicPort=16200
    
これらの設定をすると、WebCenter ContentのUIがiPlanetで動作するはずですので、テストしてみましょう。URLはhttp://<web-server>/cs/] です。
UIが動作したら、最後にWebDAVを設定しましょう。
  • iPlanet Admin Consoleを表示します。(ふつうは https://<web-server>:8989)
  • Configurations > [instance] > Virtual Servers > [Virtual Server] > WebDAV と辿っていきます。
  • [New]をクリックします。
  • /cs/idcplg/webdavを含むURLを入力します。
  • [Anyone (No Authentication)]を選択し、WebCebter Contentがセキュリティを考慮することにします。
これでWeDAV機能とDesktop Integration Suiteを使えるようになります。もちろん2バイト文字もOKです。
DesktopIntegrationSuite-double-byte-test
他のiPlanetのチューニングをやりましたので、iPlanetに関する次回のエントリでは取り扱う予定です。終了しています。

# このエントリはContentrA.comにも掲載しています。
Configuring the iPlanet as web tier for Oracle WebCenter Content (UCM) (The Content Rave)
http://blog.contentra.com/2012/05/configuring-iplanet-as-web-tier-for.html

[参考]
Using a Web Proxy Server with WebCenter Family
https://blogs.oracle.com/ATEAM_WEBCENTER/entry/using_a_web_proxy_server

2012年6月7日

[BPM, WebCenter] Oracle BPM Suite & Oracle WebCenter

原文はこちら。
https://blogs.oracle.com/webcenterportal/entry/oracle_bpm_suite_oracle_webcenter

最近、Social Business Process Management (BPM)の波が急速に持ち直してきています。Oracle BPMはOracle WebCenter Portalと"Process Space"を使って緊密に統合していますが、これはWebCenter Spacesベースのポータルと統合しており、JDeveloperベースのカスタムWebCenter Portalとの統合ではありません。さらに、Oracle WebCenter Portalは標準でワークリストタスクフローを提供していますが、本格的なワークリストの受信箱機能として使うにはいささか制限があります。 そのため、このエントリでは、お客様のOracle WebCenter Portalアプリケーションで本格的なBPMワークリストの受信箱を実現、追加する方法を手順を追ってご紹介します。

[注意]
このエントリでは、BPMプロセスは既に構築済みで、SOAサーバにデプロイ済みという前提とします。

1) ドメイン間のグローバルな信頼関係を有効にする
WebCenterとSOAのドメインの両方で、WebLogic Server管理コンソールで以下のようにパスワード(例えばwelcome1)を設定して下さい。両ドメインで同じパスワードを使うことをお間違えなく。


2) 以下のライブラリがWebCenterのサーバにデプロイ済みであることを確認します。デフォルトではデプロイされているはずです。


3) WebCenterのドメインで、SOAサーバの外部JNDI参照を作成します。
a. WebCenterドメインのWebLogic Server管理コンソールで、「外部JNDIプロバイダ」をクリックします。


b. [ドメイン構造]>[サービス]>[外部JNDI]と辿ります。
c. [新規作成]をクリックします。
d. 名前には、ForeignJNDIProvider-SOAと入れます(訳注:名前はご自由に)。
e. [OK]を押します。
f. ForeignJNDIProvider-SOA のリンクをクリックします。
g. ForeignJNDIProvider-SOAの設定ページが開きます。
h. 以下の表にあるフィールドに値を設定します。
設定項目設定内容
Initial Context Factoryweblogic.jndi.WLInitialContextFactory
Provider URLt3://soa_hostname:soa_port/soa-infra 
Userweblogic
Passwordweblogicユーザのパスワード
Confirm Passwordweblogicユーザのパスワード

i. ForeignJNDIProvider-SOAをクリックします。
j. [リンク]タブをクリックします。
k. [外部JNDIリンク]のページで、[新規作成]をクリックします。
l. [外部JNDIリンクの作成]ページが開きます。
m. 下表にある項目に値を設定します。
設定項目設定内容
NameRuntimeConfigService
JNDI NameRuntimeConfigService
Remote JNDI NameRuntimeConfigService

n. 手順mを6回繰り返し、以下の値を入力します。
繰り返し設定するもの
ejb/bpel/services/workflow/TaskServiceBean
ejb/bpel/services/workflow/TaskMetadataServiceBean
TaskReportServiceBean
TaskEvidenceServiceBean
TaskQueryService
UserMetadataService



5) ポータルアプリケーションに必要なライブラリを追加します。
a. JDeveloperにBPM拡張機能(extension)がインストールされていることを確認します。
b. ポータルプロジェクトを右クリックして、ライブラリとクラスパスを選択し、"WSRP Container"を追加します。


c. <JDEV_HOME>/soa/modules/oracle.soa.workflow_11.1.1 にあるbpm-service.jarをbpm-service.jar.origとバックアップしておきます。
d. <SOA_HOME>/soa/modules/oracle.soa.workflow_11.1.1からbpm-service.jarを上記フォルダにコピーします。
e. 上記のcとdを繰り返し、<WEBCENTER_HOME>soa/modules/oracle.soa.workflow_11.1.1のbpn-services.jarも置き換えます。
f. <JDEV_HOME>/soa/modules/oracle.soa.workflow_11.1.1/bpm-service.jarをポータルアプリのクラスパスに追加します。


g. <SOA_SERVER>/soa/modules/oracle.soa.worklist_11.1.1のadflibTaskListTaskFLow.jarとadflibWorklistComponents.jarをポータルアプリのクラスパスに追加します。


6) ポータルプロジェクトのプロパティで、デプロイメント時にライブラリを含めるように設定します。プロジェクトを右クリックし、[デプロイメント]を選択して、[編集]ボタンをクリックします。


7) 以下のライブラリをチェックします。


8) wf_client_config.xmlというファイルをsrcフォルダに作成します。


9) 以下のXMLをコピー&ペーストします。

   
      
         false
      
      
         t3://SOA_SERVER:SOA_PORT
         weblogic.jndi.WLInitialContextFactory
         false
      
      
         http://SOA_SERVER:SOA_PORT
         
            
               
            
         
      
   

10) 以下の値を設定することをお忘れなく。
a. SOA_SERVER:SOAサーバのホスト名もしくはIPアドレス
b. SOA_PORT:SOAサーバのポート番号(例:8001)
c. FEDERATED_SERVER_NAME:SOAドメインのFusion Middleware Controlで、連合するサーバ名は以下のスクリーンショットから取得できます。


11) 新たにページを作成します。例えばworklist.jspxとしましょう。tasklist-task-flow-definitionをページにリージョンとして追加します。コンポーネントパレットからadfLibTaskFlow.jarを選択することに注意して下さい。


12) タスクフローのパラメータとして以下の値を設定します。
設定項目設定内容
taskFlowModeworkspace
federatedModefalse
all other parameters that starts the word 'show'true


13) [アプリケーション]>[セキュリティ]>[リソースの付与]/security/resource grantsに移動します。


14) 以下のようにセキュリティ権限を追加します。


15) ‘worklist.jspx’ をポータルナビゲーションに追加して、以下のようにセキュリティの設定をします。


16) ポータルをデプロイしてテストします。

このエントリで、Oracleの本格的なBPMワークリストアプリケーションをOracle WebCenter Portalに入れ込むことにより、Social BPMポータルを構築できること、その際に必要な詳細情報を理解頂けたかと思います。ご質問がある方は、コメントを残して頂く(訳注:コメントは、このブログではなく原文にお願いします)か、直接メールを送って下さい。

[Cloud] Clouds Aroud the World

原文はこちら。
https://blogs.oracle.com/drcloud/entry/clouds_aroud_the_world

[訳注]
タイトルが間違っている(aroudではなくaround)ように思いますが、原文のままとしています。

今週の NIST Cloud Computing Workshop で、カナダ、中国、日本からの代表者がクラウドコンピューティングの取り組みについて発表しました。
Cloud Computing Forum & Workshop V
http://www.nist.gov/itl/cloud/cloudworkshopv.cfm
興味深かった点をいくつかご紹介します。
  • カナダでは…
    全ての市民サービスのためにService Canadaを構築しましたが、データの配置場所の問題が出てきました。クラウドデータはカナダ国外に出してはいけないので、データの配置場所がわからない、管理できないパブリッククラウドにデータをおくという選択肢はありませんでした。
  • 日本では…
    東日本大震災での壊滅的な被害に応え、日本は全国的なクラウドサービスを構築し災害救援やデータ復旧、新しいコミュニティの再構築をサポートしています(訳注:情報通信国際戦略局の阪本泰男さんと思われます)。
アメリカの大使であるPhilip Verveerは、文化や政治面での相違は心にとめつつも、クラウドサービスの相互運用を可能にする、国際的な協力と標準の開発の必要性について主張しました。さらに、業界のパネルは http://www.cloudplugfest.org での実際の相互運用テストを含め、クラウド標準の開発について報告しました。ワークショップの最初の2日間の多くは、10個の「High-Priority Requirements to Further USG Agency Cloud  Computing Adoption」に関する進捗と行動計画をカバーしていました。
US Government Cloud Computing Technology Roadmap Volume I Release 1.0 (Draft)
High-Priority Requirements to Further USG Agency Cloud Computing Adoption
http://www.nist.gov/itl/cloud/upload/SP_500_293_volumeI-2.pdf
木曜日のセッションではNIST Cloud Computing Working Groupsでの以下の取り組みをカバーする予定です。
  • Reference Architecture and Taxonomy
  • Standards Acceleration to Jumpstart the Adoption of Cloud Computing (SAJACC)
  • Cloud Security
  • Standards Roadmap
  • Business Use Cases
詳細はNISTのクラウドコンピューティングワークグループのサイトをご覧下さい。
Working Groups of NIST Cloud Computing
http://collaborate.nist.gov/twiki-cloud-computing/bin/view/CloudComputing/WebHome#Working_Groups_of_NIST_Cloud_Com

[Cloud] Oracle Unveils Industry’s Broadest Cloud Strategy

原文はこちら。
https://blogs.oracle.com/webcenter/entry/oracle_unveils_industry_s_broadest
原文はPress Releaseからの引用なので、Press ReleaseのURLも記載しておきます。
http://www.oracle.com/us/corporate/press/1656259

Adds Social Cloud and Showcases early customers

Redwood Shores, Calif. – June 6, 2012
「絶え間ないエンジニアリングとイノベーションに加え、重要な戦略的買収をほぼ7年間やってきました。十億ドルの投資をしてきました。ただいま、地球上で最も包括的なクラウドを発表します」と、OracleのCEO、Larry Ellisonが述べました。「ほとんどのクラウドベンダーは、ニッチな資産しか持っていない。彼らは拡張するプラットフォームを持っていないのです。Oracleだけが唯一、新しい、ソーシャルに対応したアプリケーションの完全なスィートを提供できるベンダーなのです。これらは、すべて標準ベースのプラットフォームに基づいています」。

News Facts

本日の主要な戦略のアップデートで、Larry Ellisonは、業界で最も広範かつ先進的なクラウド戦略を発表し、Oracle Cloud Social Servicesという、広範なエンタープライズソーシャルプラットフォームの提供を発表しました。
Oracle Cloudは、幅広い業界標準ベースの統合サービスをお客様に提供します。Oracle Platform Services、Application Services、Social Servicesへのアクセスはサブスクリプションベースで、全てOracleが完全に管理、ホスティング、サポートします。
ビジネスアプリケーションとプラットフォームサービスを幅広く提供しているので、Oracle Cloudはお客様にとって、複数のサイロ化されたパブリッククラウドを使用する際に発生する、データおよびビジネスプロセスの断片化を避けることができる、唯一のクラウドです。
Oracle Cloudは、Oracle ExadataやOracle Exalogicを含む最先端のエンタープライズ·グレードのインフラストラクチャを備えており、重要なビジネスアプリケーションを実行するための高性能で信頼性の高い、セキュアなインフラストラクチャをお客様やパートナーの皆様にご提供します。
Oracle Cloudは、ビジネスユーザーと開発者両者のためのセルフサービスを簡単に有効にできます。ビジネス·ユーザーは、注文、構成、拡張、およびそれらのアプリケーションを監視することができます。開発者および管理者は、容易に開発、デプロイ、監視、およびそれらのアプリケーションを管理することができます。
イベント中、Oracleは、Oracle Cloudの早期顧客やパートナー(システムインテグレータや独立系ソフトウェアベンダを含む)を披露しました。

Oracle Cloud Platform Services

一般的かつ、完全な、標準ベースのエンタープライズ向けのインフラストラクチャコンポーネントで構築されているため、Oracle Cloud Platform Servicesは、お客様の市場投入まで時間を短縮でき、低コストでカスタムメイドのアプリケーションを迅速に構築、展開、管理することができます。 Oracle Cloud Platform Servicesには以下の機能を含みます。
  • Database Services
    データを管理し、Oracle Databaseでデータベースアプリケーションを構築することができます。
  • Java Services
    Oracle WebLogicを使用してJavaアプリケーションを開発、展開および管理できます。
  • Developer Services
    アプリケーション開発者が共同でアプリケーションを構築できるようにします。
  • Web Services
    PHP、Ruby、およびPythonを使用して、迅速にWebアプリケーションを構築することができます。
  • Mobile Services
    最先端のスマートフォンやタブレット向けに、クロスプラットフォームのネイティブアプリケーションやHTML5モバイルアプリケーションを構築することができます。
  • Documents Services
    プロジェクトチームはオンラインワークスペースとポータルを通じてドキュメントを共有し共同作業できます。
  • Sites Services
    視覚的に魅力的なドットコムサイトをビジネスユーザーが開発し、維持できます
  • Analytics Services
    ビジネスユーザーが迅速に構築し分析ダッシュボードとレポートを、クラウドを通じて共有できます。

Oracle Cloud Application Services

Oracle Cloud Application Servicesは、今日のクラウドで利用可能な、業界で最も広範囲の領域をカバーするエンタープライズ·アプリケーション群へのアクセスをお客様に提供します。これらはビジネス·インテリジェンス機能、ソーシャル機能、モバイル機能を内蔵しています。セットアップ、構成、拡張、利用および管理が簡単な、Oracle Cloud Application Servicesには以下の内容を含んでいます。
  • ERP Services:
    財務会計、プロジェクト管理、調達、ソーシング、ガバナンス、リスク&コンプライアンスソリューションの完全なセット。
  • HCM Services
    グローバルHR、ワークフォースライフサイクル管理、ほ、福利厚生、給与などのソリューションを含む完全なヒューマン·キャピタル·マネジメント·ソリューションを提供します。
  • Talent Management Services
    採用、ソーシング、パフォーマンス管理、およびラーニングを含む完全なタレント·マネジメント·ソリューション
  • Sales and Marketing Services
    販売計画、地域管理、リード&商談管理、および予測を含む、完全な販売およびマーケティング·ソリューション
  • Customer Experience Services
    ウェブセルフサービス、コンタクトセンター、ナレッジマネジメント、チャット、電子メールの管理を含む完全なカスタマー·サービスソリューション

Oracle Cloud Social Services

Oracle Cloud Social Servicesは、現在クラウドで利用可能なもののうち、最も幅広く完全なエンタープライズソーシャルプラットフォームを提供します。Oracle Cloud Social Servicesにより、企業はソーシャルマーケティング、商取引、サービス、リスニングを含む、包括的かつ有意義な方法で、ソーシャルメディアの特性に基づいて、お客様と協働することができます。また、このプラットフォームでは、従業員が企業内で効果的に協力するためのリッチなソーシャル·ネットワーキング·ソリューションを企業に提供します。 Oracleの統合されたソーシャルプラットフォームには以下のものが含まれています。
  • Oracle Social Network
    セキュアなエンタープライズ·コラボレーションとビジネスのための意図的なソーシャルネットワーキングを実現する
  • Oracle Social Data Services
    ソーシャルネットワークや企業のデータソースからデータを集約し、ビジネスアプリケーションを強化する
  • Oracle Social Marketing and Engagement Services
    マーケティング担当者がソーシャルマーケティングキャンペーンを立ち上げ、公開、モデレート、管理、測定、報告までを一元管理することができる
  • Oracle Social Intelligence Services
    マーケティング担当者がソーシャルメディア・インタラクションを分析し、顧客サービスと営業チームが効果的に顧客や見込み客に対応できるようにする

Supporting Resources

Oracle Cloud – learn more
cloud.oracle.com – sign up now
Webcast – watch the replay

About Oracle

オラクルは、クラウド環境と皆様のデータセンターの両方においてハードウェアとソフトウェアが連携して稼動するよう設計します。オラクル(NASDAQ:ORCL)に関するより詳細な情報については、http://www.oracle.comをご覧ください。

2012年6月6日

[Java] Bert Ertman and Paul Bakker on Spring to Java EE 6 Migration Podcast

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

NLJUGのリーダであり、Java ChampionであるBert ErtmanとPaul BakkerがSpringアプリケーションのJava EE 6への移行について、最新号のJava Spotlight Podcast エピソード85で語っています。
Java Spotlight Episode 85: Migrating from Spring to JavaEE 6
https://blogs.oracle.com/javaspotlight/entry/java_spotlight_episode_85_migrating
BertとPaulがSpringで作成したレガシーアプリケーションを移行し、最新かつ軽量なJava EE 6を利用するための5ステップについて語っています。

このPodcastはいつも楽しいのですが、お時間がない方は、3分49秒経過したあたりに飛んで下さい。彼らは全く同じ内容の一連の記事を投稿しています(以下のリンクからどうぞ)。
Article Series: Migrating Spring Applications to Java EE 6 – Part 1
http://howtojboss.com/2012/04/17/article-series-migrating-spring-applications-to-java-ee-6-part-1/
SpringからJava EE 6へ移行する上で役立つ記事を以下のリンクにまとめています。将来のコンテンツのためにも、是非Podcastを購読してみてはいかがでしょうか。
Spring to Java EE 6 Articles
https://blogs.oracle.com/theaquarium/entry/spring_to_java_ee_6
The Java Spotlight Podcast
http://feeds.feedburner.com/TheJavaSpotlightPodcast

2012年6月5日

[EM] Oracle Enterprise Manager Ops Center 12c : Enterprise Controller High Availability (EC HA)

原文はこちら。
https://blogs.oracle.com/oem/entry/oracle_enterprise_manager_ops_center3

このエントリはOracle Enterprise Manager Ops CenterチームのMahesh shamaが協力してくれました。

Oracle Enterprise Manager Ops Center 12cではEnterprise Controllerの可用性を高める新機能(EC HA / Enterprise Controller High Availability)が導入されています。ハードウェアが故障したりEnterprise Controllerサービスやリモートのデータベースが応答しなくなったりした場合、EC HAがあると、エンタープライズサービスを別の待機系Enterprise Controllerで即座に再起動します。この際管理者の手を煩わせることはありません。
このエントリではEC HAについて概要をご説明し、前提条件を示して、Enterprise ControllerがどのようにBUI(ブラウザユーザーインタフェース)で表示されるか、スクリーンショットをいくつかご紹介しましょう。次回のエントリで、高可用性環境へのECのインストール方法と新しいコマンドをご紹介します。

EC HAとは?

Enterprise Controller High Availability (EC HA) は、Oracle Clusterwareフレームワーク中の2個以上のOps Center Enterprise ControllerのActive/Standbyでフェールオーバさせるソリューションです。これを使うことで、ハードウェアの故障やあるサービスが落ちた場合に、ECリソースが待機系に移転することができます。また、アクティブなECに対するメンテナンスが必要な場合は、手作業でサービスの移転も可能です。ECサービスが待機系に移転すると、アクティブノードで停止し、スタンバイノードで待機系を立ち上げるまでの間だけ、ECサービスを中断します。

前提条件は?

ECをHAフレームワークにインストールするための前提条件を知っておく必要があります。これらの前提条件をインストールし設定する方法には色々なやり方がありますが、このエントリではそこには触れません。しかし、インストールおよび設定時にベストプラクティスを適用したほうがいいと考えていますので、読者の皆様がインストールおよび設定に不慣れということであれば、エキスパートの助けを借りるべきでしょう。
では前提条件について見ていきます。
  • ハードウェア
    • アクティブノード、スタンバイノードをホストするサーバが必要です。ノードはクラスタ環境に存在するので、モデルや設定はあらゆる点で等しく同じである必要があります。ノードはプロセッサ、コア数、メモリ、ネットワークカードなどが同じであるべきです。
  • OS
    • x86もしくはSPARC上で動作する、Solaris 10 9/10 以後、Solaris 11、OEL 5.5以後
  • ネットワーク
    • クラスタウェアにおいて数多くのネットワークカードの要件があります。そしてケーブルは全てのノードを結線しておくべきです。また、IPアドレスの割当て(パブリックIP/プライベートIPおよびVIP)も考慮しなければなりません。
  • ストレージ
    • クラスタ投票ディスク、Oracle Cluster Register (OCR)、ECのライブラリのためにに共有ストレージが必要です。
  • クラスタウェア
  • リモートのデータベース
  • EC HAのインストール方法に関する詳細情報は以下のリンクをご覧下さい。
    Oracle® Enterprise Manager Ops Center Installation Guide for Oracle Solaris Operating System, 12c Release 1 (12.1.0.0.0)
    Installation and Configuration
    http://docs.oracle.com/cd/E27363_01/doc.121/e25140/install_config-shared.htm#OPCSO242
  • Oracle Clusterwareのインストールについての詳細手順は以下のリンクをご覧下さい。
    Oracle® Real Application Clusters Installation Guide 11g Release 2 (11.2) for Linux and UNIX
    Before You Start: Planning Your Installation
    http://docs.oracle.com/cd/E11882_01/install.112/e17214/chklist.htm#BHACBGII
  • リモートのOracle Databaseをインストールする詳細手順は以下のリンクをご覧下さい。
    Oracle Database 11g Documentation
    http://www.oracle.com/technetwork/database/enterprise-edition/documentation/index.html
以下の模式図で前提条件がどのようにつながっているかがわかるかと思います。

フェールオーバが発生すると、Enterprise ControllerのリソースとVIPが待機ノードの一つに移ります。その後、待機ノードがアクティブになり全てのOps Centerサービスが再開されます。

お使いのブラウザからEnterprise Controllerに接続する

では、全ての前提条件がインストールかつ構成済みで、Ops Centerがアクティブ/スタンバイノードにインストール済みであるという状況からスタートします。この状態では、ブラウザからアクティブノード(http://<active_node1>/)接続できます。この接続は仮想IPアドレス(VIP)にリダイレクトされます。 VIPは、Enterprise Controllerのリソースに付随して移動するIPアドレスです。

ログオンして、資産を表示すると、いくつかの新しいシンボルが表示されますが、これらはノードがクラスタメンバであることを示しています。この例では、一方がアクティブメンバであり、他方はスタンバイメンバーです。スタンバイノードに接続すると、スタンバイノードに接続していることを示すスプラッシュページにリダイレクトされます。

このエントリに関心を持ってもらえるとうれしいです。次のエントリではEnterprise ControllerをHAフレームワークにインストールする方法をご紹介する予定です。

2012年6月4日

[Application] June Webcast: SOA Gateway Implementation and Troubleshooting (2 sessions)

原文はこちら。
https://blogs.oracle.com/ebs/entry/june_webcast_soa_gateway_implementation

2012年6月、SOA Gatewayの実装とトラブルシューティングに関するWebcastを予定しています。2人の経験豊富なルーマニアのサポートエンジニアがこのWebcastのスピーカーです。いつも通り世界中の皆さんに聞いて頂けるよう、2セッション実施します。

[訳注]
このAdvisor Webcastをご覧頂くにはMy Oracle Supportのアカウントが必要です。

EBS - SOA Gateway Overview and Troubleshooting
  • アジェンダ
    • SOA Gateway概要
    • アーキテクチャ
    • 主要コンポーネント
    • トラブルシューティング
    • 事例

EMEA向け
US向け
Advisor Webcastの予定に関する質問や将来計画しているAdvisor Webcastへのアドバイスがありましたら、Ruediger Zieglerまでメールをお願いします。

[Coherence] Throttling Cache Events

原文はこちら。
https://blogs.oracle.com/felcey/entry/throttling_cache_events

Oracle Coherenceのリアルタイムイベント機能は状態の変化を他システムやユーザに伝達する上ですばらしい機能ですが、全ての変更が必要なものであるとは限らず、全ての変更をコンシューマに送信できるわけではなかったりします。例えば…
  • 急速な変化を送信されるスピードに合わせて消費/解釈できない場合。株価の変化を見ている利用者は秒間1回の変更にしか解釈・対応できません。
  • クライアントが低帯域の接続を使っている可能性があるので、迅速にイベントを送信すると結果としてQueueにたまり遅延が発生するだけになってしまいます。
  • 非常に数多くのクライアントが状態変化の通知を必要とし、秒間100イベントを1000クライアントに送信することは利用可能なハードウェアではサポートできませんが、秒間10イベントを1000クライアントに送信することは叶です。この例では状態変化の多くは同じ値にしていることを前提にしていますので、ご注意下さい。
Coherenceのキャッシュイベントをスロットリング(絞り込み)への一つの簡単な方法として、キャッシュストアを使ってあるキャッシュ(データキャッシュ)への変化を捕まえ、その変化を定期的に別のキャッシュ(イベントキャッシュ)に挿入するという方法があります。最初のキャッシュの状態変化に関心があるコンシューマは関心(イベントリスナ)を第2のイベントキャッシュに対して登録します。キャッシュストアのwrite-behind機能を使って同一のキャッシュエントリの高速な更新をまとめて更新をマージし、設定した時間間隔でイベントキャッシュに書き込みます。変化をイベントキャッシュに書き込む時間間隔は、キャッシュ構成ファイルのwrite-behindの遅延時間を使って容易に設定可能です。以下の構成ファイルでは、<write-delay>要素の値がそれに相当します。

    
      CustomDistributedCacheScheme
      CustomDistributedCacheService
      1
      
        
          CustomRWBackingMapScheme
          
            
          
          
            
              CustomCacheStoreScheme
              com.oracle.coherence.test.CustomCacheStore
              
                
                  java.lang.String{cache-name}
                
                  java.lang.Stringcqc-test
              
            
          
          1s
          0
        
      
      true
    
  
このスロットリングを実現するキャッシュストアの実装はそれほど難しいものではなく、基本的なキャッシュストアの機能をオーバーライドするだけです。
public class CustomCacheStore implements CacheStore {
 private String publishingCacheName;
 private String sourceCacheName;

 public CustomCacheStore(String sourceCacheStore, String publishingCacheName) {
  this.publishingCacheName = publishingCacheName;
  this.sourceCacheName = sourceCacheName;
 }

 @Override
 public Object load(Object key) {
  return null;
 }

 @Override
 public Map loadAll(Collection keyCollection) {
  return null;
 }

 @Override
 public void erase(Object key) {
  if (sourceCacheName != publishingCacheName) {
   CacheFactory.getCache(publishingCacheName).remove(key);
   CacheFactory.log("Erasing entry: " + key, CacheFactory.LOG_DEBUG);
  }
 }

 @Override
 public void eraseAll(Collection keyCollection) {
  if (sourceCacheName != publishingCacheName) {
   for (Object key : keyCollection) {
    CacheFactory.getCache(publishingCacheName).remove(key);
    CacheFactory.log("Erasing collection entry: " + key,
      CacheFactory.LOG_DEBUG);
   }
  }
 }

 @Override
 public void store(Object key, Object value) {
  if (sourceCacheName != publishingCacheName) {
   CacheFactory.getCache(publishingCacheName).put(key, value);
   CacheFactory.log("Storing entry (key=value): " + key + "=" + value,
     CacheFactory.LOG_DEBUG);
  }
 }

 @Override
 public void storeAll(Map entryMap) {
  if (sourceCacheName != publishingCacheName) {
   CacheFactory.getCache(publishingCacheName).putAll(entryMap);
   CacheFactory.log("Storing entries: " + entryMap,
     CacheFactory.LOG_DEBUG);
  }
 }
} 
おわかりのように、各キャッシュストアのデータキャッシュへの操作の結果、イベントキャッシュへの類似した操作になります。これはたくさんの可能性がある非常に単純なパターンですが、いくつかの欠点に注意しておく必要があります。
  • このイベントスロットリングの実装では、データキャッシュに保持するエントリの複製コピーはイベントキャッシュにも保持する必要があるので、余分にメモリを使います。イベントキャッシュにバックアップを持つ場合、2倍必要です。
  • データキャッシュは既にキャッシュストアを使っている可能性があるので、「多重化キャッシュストアパターン」を使って変更を既存のキャッシュストアやスロットリング対象のキャッシュストアに送信する必要があります。 
このスロットリングのサンプルを試したいということでしたら、こちらからサンプルをダウンロードできます。お役に立てば光栄です。さらなる最適化の目星がついたら是非教えて下さい。
[参考]
Oracle® Coherence Developer's Guide Release 3.7.1
Oracle® Coherence開発者ガイド リリース3.7.1

2012年6月3日

[SOA, Security] Identity Propagation across Web and Web Service - 11g

原文はこちら。
https://blogs.oracle.com/owsm/entry/identity_propagation_across_web_and

最近お客様を訪問した際にこのトピックが出てきました。実はこのトピックは何度となく出てくるものなので、WebアプリケーションでのSSOを実現する上での推奨モデル、背後のWebサービス間でのID伝播を実現する上での推奨モデルを説明しようと思いました。

下図は典型的なフローです。


以下にフローの各ステップで起こっていることをドリルダウンして説明しています(図中の赤の数字は、スタックで発生している処理の舞台裏を説明と対応しています)。
[1] WebアプリケーションはOAMで保護されているため、典型的なSSOシナリオがあてはまります。WebアプリケーションのURLはOAMで保護されています。Web GateはブラウザからWebアプリケーションへのリクエストをインターセプトし、OAM(SSO)トークンがある場合はWeb GateがOAMトークンが正当性を確認します。SSOトークンがない場合、ユーザをログインページに案内し、ユーザが資格証明を入力します。ユーザが認証されるとOAMトークンを当該ブラウザセッション用に作成します。
[2] Web GateがOAMトークンを正当と確認したら、トークンをWebアプリケーションが動作しているWebLogic Serverへ伝播します。OAM Identity AsserterをWebLogicドメインで確実に構成する必要があります。OAM Identity Asserterが設定されていれば、JAASサブジェクトが作成されることになります。
詳細は以下のドキュメントをご覧下さい。
Oracle® Fusion Middleware Administrator's Guide for Oracle Access Manager with Oracle Security Token Service 11g Release 1 (11.1.1)
Configuring OAM Security Providers for WebLogic
http://docs.oracle.com/cd/E23943_01/doc.1111/e15478/webgate.htm#CACIAEDJ
[3] (Webアプリケーションの)WebサービスクライアントをOWSM SAML Client Policyで保護します。この方法で保護する場合、OWSMエージェントは(OAM Identity Asserterが[2]で作成している)JAASサブジェクトからSAMLトークンを作成し、SOAPメッセージに入れ込みます。
Java EE JAX-WSプロキシクライアントをOWSMポリシーで保護する手順は以下のドキュメントをご覧下さい。
Oracle® Fusion Middleware Security and Administrator's Guide for Web Services 11g Release 1 (11.1.1.6)
Attaching Policies to Java EE Web Service Clients
http://docs.oracle.com/cd/E23943_01/web.1111/b32511/attaching.htm#BABBHHHC
[注意]図にあるように、Java EE WebアプリケーションではなくWebCenterを使ってポートレットを構築することもできます。WebCenterを使う場合、同じアーキテクチャに従うことができます。WebCenterのポートレットをOWSMで保護する手順だけが異なります。
Oracle® Fusion Middleware Administrator's Guide for Oracle WebCenter Portal 11g Release 1 (11.1.1.6.0)
Configuring WS-Security
http://docs.oracle.com/cd/E23943_01/webcenter.1111/e12405/wcadm_security_wss.htm#CIHEBAHB
[4] SOAコンポジットアプリケーションをOWSM SAML Policyで保護します。OWSMエージェントはインバウンドSOAPリクエストをインターセプトし、SAMLトークンが正当であることを確認し、JAASサブジェクトを作成します。
[5] SOAコンポジットアプリケーションがOSBのProxy Serviceを呼び出そうとする場合、SOAコンポジットアプリケーションの「参照(Reference)」をOWSMのSAML Client Policyで保護します。ここで再度OWSMエージェントは[4]でOWSMエージェントが作成したJAASサブジェクトから新たにSAMLトークンを作成し、SOAPメッセージに埋め込みます。
SOAコンポジットアプリケーション(サービス、参照、コンポーネント)を保護する手順は以下のドキュメントをご覧下さい。
Oracle® Fusion Middleware Security and Administrator's Guide for Web Services 11g Release 1 (11.1.1.6)
Attaching Policies to Web Services
http://docs.oracle.com/cd/E23943_01/web.1111/b32511/attaching.htm#CEGDGIHD
[6] リクエストがOSBのProxy Serviceに到達すると、Proxy Serviceを再度OWSM SAML Token Service Policyで保護します。それゆえ[4]と同じ手順を実行します。最終結果はJAASサブジェクトです。
[7] OSBが業務アプリケーションのWebサービスを呼び出す必要がある場合は、OSBのBusiness Serviceを経由します。OSBのBusiness ServiceはOWSMのSAML Client Policyで保護されており、[5]が繰り返されます。
OSBのProxy ServiceとBusiness Serviceを保護する手順は以下のドキュメントをご覧下さい。
Oracle® Fusion Middleware Administrator's Guide for Oracle Service Bus 11g Release 1 (11.1.1.6.2)
Proxy Service Policy Page
http://docs.oracle.com/cd/E23943_01/admin.1111/e15867/proxy_services.htm#OSBAG1097
Oracle® Fusion Middleware Oracle Service Bus管理者ガイド 11g リリース1(11.1.1.6.0)
プロキシ・サービス・ポリシー・ページ
http://docs.oracle.com/cd/E28389_01/admin.1111/b61436/proxy_services.htm#OSBAG1097
[8] 最終的にメッセージが業務アプリケーションに到達すると、このサービスはOWSM SAML Service Policyで保護されているため、OWSMエージェントが手順[4]を繰り返します。WebLogic ServerのWebサービスやADF Webサービスなどを保護する手順は以下のドキュメントをご覧下さい。
Oracle® Fusion Middleware Security and Administrator's Guide for Web Services 11g Release 1 (11.1.1.6)
Attaching Policies to Oracle Infrastructure Web Service Clients
http://docs.oracle.com/cd/E23943_01/web.1111/b32511/attaching.htm#CEGCJDIF
上記では説明を簡潔にするため、どのOWSM SAML Policyを使うべきかという点を説明していません。OWSMでは数多くのSAML Policyを標準で用意していますので、私は以下のリンクで簡単に種々のSAML Policyを用いる上でのトレードオフについて説明しています。
SAML support in OWSM - Best Practices - Part#1 - 11g
https://blogs.oracle.com/owsm/entry/saml_support_in_owsm_best
上図と、それに付随するフローの各ステップで発生している内容の説明では、STSを使わず、SAML SLもしくはSAML Bearerベースのポリシーを使っていることを前提にしています。

[Java] Transactional Interceptors in Java EE 7 - Request for feedback

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

CDIインターセプタベースのソリューションを使い、EJBのContainer Managed Transaction (CMT) をJava EEプラットフォームにどうやって適用できるのか、ということについてLindaが概要を説明しました。
Transactional Interceptors
https://blogs.oracle.com/ldemichiel/entry/transactional_interceptors 
他のJava EEコンポーネント、例えばManaged Beanなども利用できます。
この案はアノテーションと標準化された値をjavax.transactionパッケージに追加するというものです。例えば…
@Inherited
@InterceptorBinding
@Target({TYPE, METHOD})
@Retention(RUNTIME)
public @interface Transactional {
   TxType value() default TxType.REQUIRED
}

And then this can be specified on a class or a method of a class as:

public class ShoppingCart {
   ...
   @Transactional
   public void checkOut() {...}
   ...
}
このインターセプタをJava Transaction API仕様の更新の一部として、jta-spec.java.netで定義する予定です。
あなたの助力と精密なセマンティクスに対するフィードバックを必要としています。議論の全体はこちらで読むことができますので、是非users@javaee-spec.java.netにあなたの意見を投稿してください。このエントリへのコメントも検討内容に含めたいと考えています。
[jsr342-experts] transactional methods and exceptions
http://java.net/projects/javaee-spec/lists/jsr342-experts/archive/2012-01/message/35

[Java] Transactional Interceptors

原文はこちら。
https://blogs.oracle.com/ldemichiel/entry/transactional_interceptors

Java EEプラットフォーム全体でManaged Beanテクノロジーを合わせる目標の一環として、Java EE7での改善点の一つがJTAトランザクションのインターセプタの使いやすさです。ここでの意図は、CDIインターセプタベースのより一般的なソリューションを使って、全体としてプラットフォームへのEJBの container-managed transaction (CMT)の使いやすさをプラットフォームに持ち込み、これらがCDI Managed Beanおよびその他のJava EEコンポーネントで使用可能にすることです。こうした方針に対し、Java EE 7 Platform Expert Groupのメンバーから大規模なサポートがあります。
これを実現するため、アノテーションと標準化された値をjavax.transactionパッケージに追加することを考えています。以下のような感じです。
@Inherited
@InterceptorBinding
@Target({TYPE, METHOD})
@Retention(RUNTIME)
public @interface Transactional {
   TxType value() default TxType.REQUIRED
}

public enum TxType {
   REQUIRED,
   REQUIRED_NEW,
   MANDATORY,
   SUPPORTS,
   NOT_SUPPORTED,
   NEVER
}


public class ShoppingCart {
   ...
   @Transactional
   public void checkOut() {...}
   ...
}
現在、JTA仕様のアップデートの一環で対応するインターセプタクラスのセマンティクスを定義することを考えています。この取り組みはJava EE 7の下でjava.netのJTA仕様プロジェクトの一環で実施する予定です。
JTA spec project
http://java.net/projects/jta-spec/
この困難なパートはいつも通り詳細を確定する予定です。
これまでかなりの議論をやってきました(がまだ収束できていません)。ポイントは、Transactional Interceptorに達する例外が実行中のトランザクションにどのような影響を与えるか、ということをどうにかしなければなりません。
  • 常にロールバックさせるのか?
  • 決してロールバックさせないのか?
  • 実行時例外の場合のみロールバックさせるのか?
  • この挙動をアノテーションでオーバーライドしていなければロールバックさせるのか?
  • この挙動をアノテーションでオーバーライドしていなければロールバックさせないのか?
  • 挙動のオーバーライドがアノテーションで設定可能であれば、これらのアノテーションはどのような形を取るのか?
While most members of the Java EE 7 Expert Groupのほとんどのメンバーがいくつかの例外により、結果として現在のトランザクションがロールバック対象としてマークされることに同意する一方で、これを設定可能にするにはどうするのが一番よいのか、ということについて多岐にわたる意見があります。議論の詳細は以下のリンクからご覧頂けます。
[jsr342-experts] transactional methods and exceptions
http://java.net/projects/javaee-spec/lists/jsr342-experts/archive/2012-01/message/35
これを解決しようとする前に、もっと多くの開発者コミュニティからフィードバックを頂きたいと切に希望しています。この議論に参加頂くには、ここにコメントを残すか、Java EE Platform Specification Projectのメーリングリスト users@javaee-spec.java.net に参加してスレッドを追加するか、JTA仕様のプロジェクトに参加して下さい。
Java EE Platform Specification
http://java.net/projects/javaee-spec/pages/Home
Java Transaction API Specification
http://java.net/projects/jta-spec/

2012年6月2日

[FMW, Support] Oracle Fusion Middleware Support News - June 2012 Edition

原文はこちら。
https://blogs.oracle.com/fmwinstallproactive/entry/oracle_fusion_middleware_support_news

第4号(2012年6月版)のOracle Fusion Middleware Support Newsが発行されています。以下はスクリーンショットの「ちら見せ」です。

このニュースをご覧頂くには、以下のリンクからどうぞ。なお、My Oracle Supportのアカウントが必要です。
Oracle Fusion Middleware Support News : Current Edition - Volume 4 : June 2012 [ID 1347075.1]
https://support.oracle.com/CSP/main/article?cmd=show&type=NOT&id=1347075.1 

2012年6月1日

[Coherence] Testing the Coherence Simple Partition Assignment Strategy

原文はこちら。
https://blogs.oracle.com/felcey/entry/testing_the_coherence_simple_assignment

Coherence 3.7.1で導入された単純なパーティション割当て方針(Simple Partition Assignment Strategy)を使うと、Coherenceが集中管理型のパーティショニング方針を使って、プライマリおよびバックアップデータのキャッシュ·データのパーティションを再バランスすることができます。以前は(現在のデフォルト設定でもありますが)、各クラスタ·メンバーは、キャッシュデータのパーティションを(単独で)自律的に分散する方法を決定していました。例えば、パーティションの総個数をクラスタメンバの個数で割って決めていました。
Oracle® Coherence Developer's Guide Release 3.7.1
Specifying the Simple Partition Assignment Strategy
http://docs.oracle.com/cd/E24290_01/coh.371/e22837/api_dataaffinity.htm#sthref131Oracle® Coherence開発者ガイド リリース3.7.1
単純なパーティション割当て方針の指定
http://docs.oracle.com/cd/E26853_01/coh.371/b65026/api_dataaffinity.htm#sthref131
集中管理型の方針を使うと 、 完全なクラスタトポロジを考慮に入れることができます。既定の自律型の方針のように、Simple Partition Assignment Strategyはキャッシュデータのパーティションをかなり分散しようとしますが、可能な限り、データのプライマリとバックアップコピーを別のサイト、ラック、マシンに配置することによって、データの安全性を確保しようともします。それゆえ、複数のサイトがある場合、プライマリとバックアップデータが異なるサイトに置かれます。クラスタが複数のラックをまたがるような場合、プライマリパーティションとバックアップパーティションが別のラックに置かれるので、完全なラックの故障の結果、データが損失することはありません。最後に、すべてのマシンが同じラックにあれば、プライマリパーティションとバックアップパーティションは、異なるマシン上に配置されます。
Simple Partition Assignment Strategyが、キャッシュデータパーティションをどこに配置するべきかを決定するため、クラスタ内の各メンバが完全なIDを指定する必要があります。つまり、キャッシュが載るマシンやラック、サイトの名前を、member-identity要素を使って指定する必要があります。
member-identity element
http://docs.oracle.com/cd/E24290_01/coh.371/e22837/appendix_operational.htm#BABCHJJCmember-identity要素
http://docs.oracle.com/cd/E26853_01/coh.371/b65026/appendix_operational.htm#BABCHJJC
これらは通常システムプロパティとして設定されています(以下のような感じ)が、クラスタオーバーライドファイルに配置することもできます。
-Dtangosol.coherence.cluster=ProdAppCluster
-Dtangosol.coherence.site=MainDataCentre
-Dtangosol.coherence.rack=Rack07
-Dtangosol.coherence.machine=Blade11
通常、 Simple Partition Assignment Strategyが機能していることをテストするには、相当のセットアップが必要ですが、 Jon Hallが作成した"littlegrid"と呼ばれる小規模なテストフレームワークを使うと、テスト全体を一つのJVMインスタンス上で実行でき、簡単なJUnitテストとして記述することができます。以下は新たに(分散サービスCustomDistributedCacheServiceへの)Simple Partition Assignment Strategyのクラスを導入するキャッシュの構成ファイルです、<partition-assignment-strategy>で括られた部分で割当て方針を指定しています。

  
    pof
  
  
    
      *
      CustomDistributedCacheScheme
    
  
  
    
      CustomDistributedCacheScheme
      CustomDistributedCacheService
      5
      
        
          com.tangosol.net.partition.SimpleAssignmentStrategy
          
        
      
      
        com.oracle.coherence.test.PartitionLostListener
      
      
         ">
        
      
      true
    
  

では、ここではJUnitテストのセットアップをします。"littlegrid"テストフレームワークを使ってラックの故障をシミュレーションしてみましょう。3個のラックは各々に2個のマシンがあり、各マシンに2個のノードを作成します。同時に、管理ノードとストレージを持たないテストクライアントを用意します。最後の2ノードは別のラック(デフォルトラック)に存在します。テストは以下の手順を実行します。
  1. あるデータをテストキャッシュに追加し、データを各パーティションに持つ
  2. (作成された3個から) ランダムにラックを選択し、当該ラックの全てのノードが同時にシャットダウンする
  3. 短い休止の後、 JMX MBean "Partition List"(下記参照)を全ての残りのストレージメンバについてチェックし、パーティションが失われていないことを確認する。
この最後のステップが可能なのは、Partition Event ListenerをCache構成ファイルにPartitioned Cache Service(CustomDistributedCacheService)として登録していためです。このPartition Event Listenerは自身をJMX MBeanとして公開するので、この類のイベントをチェックすることが可能です。

テストコードは以下のようなものです。

package com.oracle.coherence.test;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import java.lang.management.ManagementFactory;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import javax.management.MBeanServerConnection;
import javax.management.ObjectName;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.littlegrid.ClusterMemberGroup;
import org.littlegrid.ClusterMemberGroupUtils;

import com.tangosol.net.CacheFactory;
import com.tangosol.net.Member;
import com.tangosol.net.NamedCache;
import com.tangosol.net.PartitionedService;

/**
 * Coherence simple assignment strategy tests.
 * 
 * @author Dave Felcey
 */
public class TestCase {
  private ClusterMemberGroup memberGroup;
  private NamedCache cache = null;
  private int[][] racks = null;

  @Before
  public void setUp() {
    // Create member group now, so later code simply merges into this group
    memberGroup = ClusterMemberGroupUtils.newBuilder()
        .buildAndConfigureForNoClient();

    final int numberOfRacks = 3;
    final int numberOfMachines = 2;
    final int numberOfStorageEnabledMembersPerMachine = 2;
    final int expectedClusterSize = (numberOfRacks
        * numberOfMachines * numberOfStorageEnabledMembersPerMachine);

    racks = new int[numberOfRacks][numberOfMachines
        * numberOfStorageEnabledMembersPerMachine];

    // Start up the storage enabled members on different racks and machines
    for (int rack = 0; rack < numberOfRacks; rack++) {
      for (int machine = 0; machine < numberOfMachines; machine++) {
        // Build using the identity parameters
        memberGroup.merge(ClusterMemberGroupUtils
            .newBuilder()
            .setFastStartJoinTimeoutMilliseconds(100)
            .setSiteName("site1")
            .setMachineName("r-" + rack + "-m-" + machine)
            .setRackName("r-" + rack)
            .setStorageEnabledCount(
                numberOfStorageEnabledMembersPerMachine)
            .buildAndConfigureForNoClient());
      }

      // Save member id's for rack
      System.arraycopy(memberGroup.getStartedMemberIds(),
          rack * numberOfMachines
              * numberOfStorageEnabledMembersPerMachine,
          racks[rack], 0, numberOfMachines
              * numberOfStorageEnabledMembersPerMachine);
    }

    // Create Management and client members with default rack and machine
    // identities
    memberGroup.merge(ClusterMemberGroupUtils.newBuilder()
        .setJmxMonitorCount(1).setLogLevel(9)
        .buildAndConfigureForStorageDisabledClient());

    assertThat(
        "Cluster size check - includes storage disabled client and JMX monitor",
        CacheFactory.ensureCluster().getMemberSet().size(),
        is(expectedClusterSize + 2));

    assertThat(
        "Member group check size is as expected - includes JMX monitor, but not storage disabled client",
        memberGroup.getStartedMemberIds().length,
        is(expectedClusterSize + 1));

    cache = CacheFactory.getCache("test");
  }

  /**
   * Demonstrate SimpleAssignementStrategy.
   */
  @Test
  public void testSimpleAssignmentStrategy()
      throws Exception {

    final Map entries = new HashMap();
    final int totalEntries = 1000;

    // Load test data
    for (int i = 0; i < totalEntries; i++) {
      entries.put(i, "entry " + i);
    }

    cache.putAll(entries);
    assertThat(cache.size(), is(totalEntries));

    // Kill rack - if partition lost then will exit
    Random random = new Random();
    int rack = Math.abs(random.nextInt() % racks.length);
    System.out.println("Stopping rack: " + rack);

    memberGroup.stopMember(racks[rack]);

    System.out
        .println("Pausing to allow data to be recovered");
    TimeUnit.SECONDS.sleep(memberGroup
        .getSuggestedSleepAfterStopDuration()
        * racks[rack].length * 10);

    assertThat("Partition lost",
        getPartitionLostEventCount(), is(0));
    assertThat("Cache size", cache.size(), is(totalEntries));
  }

  @After
  public void tearDown() {
    // Quick stop all - members *don't* leave the cluster politely - done for
    // this test so it shuts down quicker
    memberGroup.stopAll();

    ClusterMemberGroupUtils
        .shutdownCacheFactoryThenClusterMemberGroups(memberGroup);
  }

  /**
   * Get the number of partitions lost.
   * 
   * @return partitions lost
   */
  private int getPartitionLostEventCount() throws Exception {

    // Create an MBeanServerConnection
    final MBeanServerConnection connection = ManagementFactory
        .getPlatformMBeanServer();

    @SuppressWarnings("unchecked")
    final Set members = ((PartitionedService) cache
        .getCacheService()).getOwnershipEnabledMembers();
    final String serviceName = cache.getCacheService()
        .getInfo().getServiceName();

    int lostPartitions = 0;

    // Get any partition lost event information from cluster members
    for (Member member : members) {
      String path = "Coherence:type=PartitionListener,name=PartitionLostCount,service="
          + serviceName
          + ",id=PartitionLost,nodeId="
          + member.getId();

      lostPartitions += (Integer) connection.getAttribute(
          new ObjectName(path), "PartitionLostCount");
    }

    return lostPartitions;
  }
}
ラックが停止してからの停止時間を延ばすと、PartitionList MBean情報をJConsoleで見ることができます(下図)。

Andrew Wilsonのサンプルに基づくPartitionLostListernerは以下のようになります。
package com.oracle.coherence.test;

import java.util.concurrent.atomic.AtomicInteger;

import com.tangosol.net.CacheFactory;
import com.tangosol.net.management.Registry;
import com.tangosol.net.partition.PartitionEvent;
import com.tangosol.net.partition.PartitionListener;

/**
 * Partition lost listener
 */
public class PartitionLostListener implements
    PartitionListener, PartitionLostListenerMBean {
  private final AtomicInteger lostCount = new AtomicInteger();
  private String serviceName;

  public PartitionLostListener() {
  }

  @Override
  public synchronized void onPartitionEvent(
      PartitionEvent partitionEvent) {
    // Initialize if necessary
    if (serviceName == null) {
      serviceName = partitionEvent.getService().getInfo()
          .getServiceName();
      System.out.println("Registering JMX");
      Registry reg = CacheFactory.getCluster()
          .getManagement();
      reg.register(
          reg.ensureGlobalName("Coherence:type=PartitionListener,name=PartitionLostCount,service="
              + serviceName + ",id=PartitionLost"), this);
      System.out.println("Registered JMX");
    }

    // Handle the event
    if (partitionEvent.getId() == PartitionEvent.PARTITION_LOST) {
      System.out.println("Partition lost: "
          + partitionEvent);
      lostCount.addAndGet(partitionEvent.getPartitionSet()
          .cardinality());
    }
  }

  // Returns any partitions lost and resets
  public synchronized Integer getPartitionLostCount() {
    int temp = lostCount.get();
    lostCount.set(0);
    return temp;
  }
}
ご自身で試して見たいということでしたら、こちらから完全なサンプルフォームをダウンロードして、"littlegrid"テストツールをこちらからダウンロードして下さい。ご注意頂きたいのですが、適切にSimple Partition Strategyをテストするためには、最新のCoherenceを利用する必要があります(執筆時点で3.7.1.4がOracle Supportからダウンロードできます)。ただ、OTNからはこのパッチリリースをダウンロードできません。大規模クラスタでSimple Partition Assignment Strategyを利用する上でのもう一つのコツは、クラスタ立ち上げ時に分散クォーラム機能を使うことです。不要なネットワークトラフィックおよび処理を除去しながら、クラスタメンバシップの閾値が到達するまで、パーティションのバランスを取り戻しを抑止します。
nラックのクラスタの場合の閾値は、まず(n -1) * (ラックあたりのマシン個数 - 1)に設定しましょう。リストアクォーラムおよび読み取りクォーラムの機能は、"スプリットブレイン"シナリオの影響を緩和するために使用されることがあります。これが発生する場合、データを読み取り専用にして、クラスタが再構成できるようにすることで影響を緩和しようというものです。
Oracle® Coherence Developer's Guide Release 3.7.1
Using the Partitioned Cache Quorums
http://docs.oracle.com/cd/E24290_01/coh.371/e22837/cache_quorum.htm#BABEEBGG
Oracle® Coherence開発者ガイド リリース3.7.1
パーティション・キャッシュ・クォーラムの使用方法
http://docs.oracle.com/cd/E26853_01/coh.371/b65026/cache_quorum.htm#BABEEBGG