プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Event Processingのカスタマイズ
12c リリース(12.1.3)
E57535-04
目次へ移動
目次

前
前へ
次
次へ

2 アダプタおよびイベントBeanの拡張

XMLスキーマ定義(XSD)またはJava Architecture for XML Binding (JAXB)注釈を使用して、アダプタおよびイベントBeanのデフォルトの構成を拡張できます。

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

2.1 注釈

コンポーネントの構成を拡張する最も簡単で効率的な方法は、JAXB javax.xml.bind.annotationパッケージで指定されている注釈を使用して、カスタム・アダプタまたはイベントBean JavaBeanクラスに注釈を付けることです。詳細は、http://docs.oracle.com/javaee/7/api/javax/xml/bind/annotation/package-summary.htmlおよびhttps://jaxb.java.net/を参照してください。

注釈によるコンポーネント構成の拡張

  1. カスタム・アダプタまたはイベントBean JavaBeanクラスを実装します。
  2. カスタム・アダプタまたはイベントBeanの属性に注釈を付けて、javax.xml.bind.annotationパッケージの該当する注釈をコンポーネント構成に指定します。

    重要なannotations from the javax.xml.bind.annotationパッケージには次のものが含まれます。注釈のないプロパティは、デフォルトでオプションの構成プロパティ(@XmlElement)になります。

    • @XmlElement: プロパティは、コンポーネント構成のオプション部分です。

    • @XmlElement(required=true): プロパティは、コンポーネント構成の必須部分です。

    • @XmlTransient: プロパティは、コンポーネント構成の一部ではありません。

    • @XmlJavaTypeAdapter: この注釈付きのプロパティ要素は、ほとんどのJavaデータ型に対応するカスタム処理を指定できます。

      注意:

      @XmlJavaTypeAdapterを拡張使用する場合は、独自のカスタム・スキーマを定義することを検討してください。「XSDファイル」を参照してください。

    次の例では、次のことを指定するためのjavax.xml.bind.annotation注釈で注釈を付けたカスタム・アダプタ実装を示します。

    • count: コンポーネント構成の一部ではありません。

    • doit: コンポーネント構成の必須部分です。

    • size: コンポーネント構成の必須部分です。howBigインスタンス・プロパティにマップします。

    @XmlType(name="SampleAdapterConfig", namespace="http://www.oracle.com/ns/cep/config/sample")
    public class SampleAdapterImpl implements Adapter {
      @XmlTransient
      private int count;
    
      @XmlElement(name="size")
      private int howBig;
    
      @XmlElement(required=true)
      private boolean doit;
      
      ...
    
      public void setDoit(boolean doit) {
        this.doit = doit;
      }
    
      public boolean getDoit() {
        return doit;
      }
    }
    
  3. 「コンポーネント構成へのアクセス」で説明するとおり、カスタム・アダプタまたはイベントBeanコード内で、拡張された構成にアクセスします。
  4. アプリケーションのカスタム・コンポーネントを記述するコンポーネント構成XMLファイルを変更します。

    詳細は、「カスタム・アダプタの構成」を参照してください。

  5. アプリケーションのコンポーネントを記述するコンポーネント構成XMLファイルを作成する場合は、必ず拡張されたXSDファイルを説明として使用します。また、デフォルトのスキーマを使用するのではなく、このスキーマの名前空間を必ず指定するようにします。

    次の例では、手順2のSampleAdapterImplカスタム・アダプタのコンポーネント構成ファイルを示します。

    <?xml version="1.0" encoding="UTF-8"?>
    <app:config
      xmlns:app="http://www.bea.com/ns/wlevs/config/application"
      xmlns:sample="http://www.oracle.com/ns/cep/config/sample"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="
        http://www.bea.com/ns/wlevs/config/application
        http://www.bea.com/ns/wlevs/config/application/wlevs_application_config.xsd
        http://www.oracle.com/ns/cep/config/sample
        http://www.oracle.com/ns/cep/config/sample/ocep_sample_config.xsd">
      <processor>
        <name>clusterProcessor</name>
        <rules>
          <query id="clusterRule"><![CDATA[ select * from clusterInstream [Now] >
          </query>
        </rules>
      </processor>
        <sample:adapter>
          <name>myadapter</name>
          <config>
            <size>15</size>      <!-- optional -->
            <doit>true</doit>    <!-- required -->
          </config>
        </sample:adapter>
    </app:config>

    注意:

    拡張コンポーネント構成スキーマでは、ネストされているconfig要素が必要です。

  6. アプリケーションをパッケージ化し、デプロイします。

2.2 XSDファイル

XMLスキーマ定義(XSD)ファイルで、アダプタまたはイベントBean構成を拡張できます。新しい各要素にname属性が必要であること以外はほぼ制限なしで、必要な数のカスタム要素をXSDファイルに追加します。

名前空間を設定する場合にelementFormDefault="unqualified"を使用することで、ローカルで定義した要素に名前空間を含めず、グローバル要素でtargetNamespaceを利用することをお薦めします。これによって、接頭辞を過剰に付けなくても、スキーマ間の名前の競合を回避できます。詳細は、http://www.xfront.com/HideVersusExpose.htmlを参照してください。

アプリケーション・スキーマを拡張しないカスタム・スキーマを手動で生成することもできます。これによって、他のすべての要素を定義しなくても独自の名前空間でカスタム構成を作成できます。このメカニズムは、スキーマ生成後の注釈付けの方法と同様に機能します。

2.2.1 XSDファイルによるコンポーネント構成の拡張

  1. 拡張されたアダプタまたはイベントBean構成を記述する新規XSDスキーマ・ファイルを作成します。

    このXSDファイルには、(通常はOracle Event Processingで定義されている組込みXSDタイプを使用して記述しますが)アプリケーションの他のコンポーネント(プロセッサおよびストリーム)の記述も含める必要があります。

    「XSDファイルの作成」を参照してください。

  2. アプリケーション・ビルド・プロセスの一部として、GlassFishリファレンス実装のcom.sun.tools.xjc.XJCTask AntタスクなどのJAXBバインディング・コンパイラを使用して、XSDスキーマ・タイプのJava表現を生成します。ユーザーの利便を図るために、このAntタスクはOracle Event Processing配布に含まれています。

    次のサンプルbuild.xmlファイルは、この方法を示しています。

    <property name="base.dir" value="." />
    <property name="output.dir" value="output" />
    <property name="sharedlib.dir" value="${base.dir}/../../../../../modules" />
    <property name="wlrtlib.dir" value="${base.dir}/../../../../modules"/>
    <path id="classpath">
            <pathelement location="${output.dir}" />
            <fileset dir="${sharedlib.dir}">
                    <include name="*.jar" />
            </fileset>
            <fileset dir="${wlrtlib.dir}">
                   <include name="*.jar"/>
            </fileset>
    </path>
    <taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask">
          <classpath refid="classpath" />
    </taskdef>
    <target name="generate" depends="clean, init">
       <copy file="../../../../xsd/wlevs_base_config.xsd"
             todir="src/main/resources/extension" />
       <copy file="../../../../xsd/wlevs_application_config.xsd"
              todir="src/main/resources/extension" />
       <xjc extension="true" destdir="${generated.dir}">
          <schema dir="src/main/resources/extension" 
                  includes="helloworld.xsd"/>
          <produces dir="${generated.dir}" includes="**/*.java" />
       </xjc>
    </target>
    

    この例では、拡張されたXSDファイルはhelloworld.xsdです。helloworld.xsdOracle Event Processing XSDファイルをインポートするため、ビルド・プロセスでは、Oracle Event Processing XSDファイル(wlevs_base_config.xsdおよびwlevs_application_config.xsd)がhelloworld.xsdファイルと同じディレクトリにコピーされます。

    詳細は、https://jaxb.java.net/nonav/2.0.2/docs/xjcTask.htmlを参照してください。

  3. 生成されたこれらのJavaファイルをクラスにコンパイルします。
  4. コンパイルされたJavaクラス・ファイルをアプリケーション・バンドルにパッケージ化します。
  5. カスタム・アダプタまたはイベントBeanをプログラミングします。

    詳細は、「実装の基本」を参照してください。

  6. 「コンポーネント構成へのアクセス」で説明するとおり、カスタム・アダプタまたはイベントBeanコード内で、拡張された構成にアクセスします。
  7. アプリケーションのコンポーネントを記述するコンポーネント構成XMLファイルを作成する場合は、必ず拡張されたXSDファイルを説明として使用します。また、デフォルトのスキーマではなく、このスキーマの名前空間を必ず指定するようにします。

    次の例では、「XSDファイルの作成」で作成したXSDのコンポーネント構成ファイルを示します。

    <?xml version="1.0" encoding="UTF-8"?>
    <helloworld:config
      xmlns:helloworld="http://www.bea.com/xml/ns/wlevs/example/helloworld">
      <adapter>
        <name>helloworldAdapter</name>
        <message>HelloWorld - the current time is:</message>
      </adapter>
    </helloworld:config>
    

2.2.2 XSDファイルの作成

新しいXSDファイルはwlevs_application_config.xsd XSDを拡張し、アダプタの新しい構成要素などの新しいカスタム情報を追加します。カスタム情報には標準のXSD構文を使用します。

「XSDスキーマ・ファイルの完全な例」のXSDを基本テンプレートとして使用し、ニーズに合わせてコンテンツを変更することをお薦めします。新しい構成要素を追加するとともに、他の変更点としては、生成されたJavaコードのパッケージ名の変更やカスタム・アダプタの要素名の変更などがあります。カスタム・アダプタのみ、またはプロセッサなどの他のコンポーネントをスキーマで使用するかどうかを制御できます。

新しいXSDファイルの作成

  1. 必要な名前空間(特にJAXB用のもの)を使用して、基本のXSDファイルを作成します。次に例を示します。
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema targetNamespace="http://www.bea.com/xml/ns/wlevs/example/helloworld"
      xmlns="http://www.bea.com/xml/ns/wlevs/example/helloworld"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
      xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
      xmlns:wlevs="http://www.bea.com/ns/wlevs/config/application"
      jxb:extensionBindingPrefixes="xjc" jxb:version="1.0"
      elementFormDefault="unqualified" attributeFormDefault="unqualified">
    ...
    </xs:schema>
    
  2. wlevs_application_config.xsdファイルをインポートします。
    <xs:import 
       namespace="http://www.bea.com/ns/wlevs/config/application"
       schemaLocation="wlevs_application_config.xsd"/>
    

    wlevs_application_config.xsdファイルは、wlevs_base_config.xsdファイルをインポートします。

  3. complexType XSD要素を使用して、拡張されたアダプタ構成のXMLタイプを記述します。

    新しいタイプは、wlevs_application_config.xsdに定義されたAdapterConfigタイプを拡張する必要があります。AdapterConfigConfigurationObjectを拡張します。必要に応じて、基本のアダプタ構成に新しい要素または属性を追加できます。たとえば、次のタイプHelloWorldAdapterConfigは、基本のアダプタ構成にmessage要素を追加します。

    <xs:complexType name="HelloWorldAdapterConfig">
        <xs:complexContent>
            <xs:extension base="wlevs:AdapterConfig">
                <xs:sequence>
                    <xs:element name="message" type="xs:string"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    
  4. トップレベル要素を定義し、configという名前にする必要があります。

    config要素の定義では、アプリケーションのコンポーネントに対応する子要素のシーケンスを定義します。要素名には任意の名前を付けることができますが、通常は構成するコンポーネント(adapterprocessorchannel)を示すようにします。

    各要素は、明示的にbase属性値base:ConfigurationObjectxs:extension要素を使用するか、またはConfigurationObjectを拡張するXMLタイプを指定するかによって、ConfigurationObject XMLタイプを拡張する必要があります。ConfigurationObject XMLタイプは、wlevs_base_config.xsdで定義され、nameという単一の属性を定義します。

    アダプタ要素のタイプは、この方法の前述の手順で作成したカスタム・アダプタです。

    プロセッサまたはストリームに対応するconfigの子要素には、wlevs_application_config.xsdに記述されている次の組込みXMLタイプを使用できます。

    • DefaultProcessorConfig: デフォルト・プロセッサ構成の説明については、Oracle Event Processing Java APIリファレンスを参照してください

    • DefaultStreamConfig: デフォルト・チャネル構成の説明については、『Oracle Fusion Middleware Oracle Event Processingアプリケーションの開発』を参照してください。

    次に例を示します。

    <xs:element name="config">
      <xs:complexType>
        <xs:choice maxOccurs="unbounded">
          <xs:element name="adapter" type="HelloWorldAdapterConfig"/>
            <xs:element name="processor" type="wlevs:DefaultProcessorConfig"/>
        </xs:choice>
      </xs:complexType>
    </xs:element>
    
  5. 必要に応じてjxb:schemaBindingsjxb:package子要素を使用して、生成されたJavaコードのパッケージ名を指定します。
    <xs:annotation>
      <xs:appinfo>
         <jxb:schemaBindings>
             <jxb:package name="com.bea.adapter.wlevs.example.helloworld"/>
         </jxb:schemaBindings>
      </xs:appinfo>
    </xs:annotation>

2.2.3 XSDスキーマ・ファイルの完全な例

次の拡張されたXSDファイルをテンプレートとして使用します。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.bea.com/xml/ns/wlevs/example/helloworld"
  xmlns="http://www.bea.com/xml/ns/wlevs/example/helloworld"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
  xmlns:wlevs="http://www.bea.com/ns/wlevs/config/application"
  jxb:extensionBindingPrefixes="xjc" jxb:version="1.0"
       elementFormDefault="unqualified" attributeFormDefault="unqualified">
  <xs:annotation>
    <xs:appinfo>
      <jxb:schemaBindings>
        <jxb:package name="com.bea.adapter.wlevs.example.helloworld"/>
      </jxb:schemaBindings>
    </xs:appinfo>
  </xs:annotation>
  <xs:import namespace="http://www.bea.com/ns/wlevs/config/application" 
       schemaLocation="wlevs_application_config.xsd"/>
  <xs:element name="config">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded">
        <xs:element name="adapter" type="HelloWorldAdapterConfig"/>
        <xs:element name="processor" type="wlevs:DefaultProcessorConfig"/>
        <xs:element name="channel" type="wlevs:DefaultStreamConfig"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="HelloWorldAdapterConfig">
    <xs:complexContent>
      <xs:extension base="wlevs:AdapterConfig">
        <xs:sequence>
          <xs:element name="message" type="xs:string"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
</xs:schema>

2.3 コンポーネント構成へのアクセス

アプリケーションをデプロイする場合、Oracle Event Processingでは、コンポーネント構成ファイルに指定された各コンポーネントの構成が、JAXB標準に準拠したJavaオブジェクトにマップされます。各コンポーネントの構成データは単一のXML要素に含まれるため、JAXBでもこの構成データを表現する単一のJavaクラスが生成されます。コンポーネントの初期化時およびコンポーネントの構成が動的に変更されるたびに、Oracle Event Processingでは実行時にこのJavaクラスのインスタンスがコンポーネント(プロセッサ、チャネルまたはアダプタ)に渡されます。

このコンポーネント構成には、実行時に次の方法でアクセスできます。

  • 「リソース・インジェクション」で説明するとおり、リソース・インジェクションを使用します。

    これは実行時の、最も簡単で効率的なコンポーネント構成へのアクセス方法です。

  • 「ライフサイクル・コールバック」で説明するとおり、コールバックを使用します。

    これは、実行時にコンポーネント構成にアクセスするための最も柔軟な方法です。リソース・インジェクションがニーズに合わない場合は、このオプションを検討してください。

注意:

プロバイダからのスキーマを使用する必要があるクライアントは、プロバイダのバンドルから適切なパッケージをインポートし、プロバイダのObjectFactoryがクライアント・バンドルに表示されるようにする必要があります。

2.3.1 リソース・インジェクション

デフォルトでは、Oracle Event ProcessingはそのJavaBeanプロパティの直接インジェクション、およびその後の構成コールバックにより、アダプタおよびイベントBeanを構成します。

注釈を付けられたカスタム・アダプタ実装を検討します。

@XmlType(name="SampleAdapterConfig", namespace="http://www.oracle.com/ns/cep/config/sample")
public class SampleAdapterImpl implements Adapter {
    private boolean doit;

    public void setDoit(boolean doit) {
        this.doit = doit;
    }

    public boolean getDoit() {
        return doit;
    }
}

このカスタム・アダプタのインスタンスの構成ファイルを検討します。

<?xml version="1.0" encoding="UTF-8"?>
<app:config
      xmlns:app="http://www.bea.com/ns/wlevs/config/application"
      xmlns:sample="http://www.oracle.com/ns/cep/config/sample"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="
            http://www.bea.com/ns/wlevs/config/application
            http://www.bea.com/ns/wlevs/config/application/wlevs_application_config.xsd
            http://www.oracle.com/ns/cep/config/sample
            http://www.oracle.com/ns/cep/config/sample/ocep_sample_config.xsd">
  <processor>
    <name>clusterProcessor</name>
    <rules>
      <query id="clusterRule"><![CDATA[ select * from clusterInstream [Now] ></query>
    </rules>
  </processor>
    <sample:adapter>
        <name>myadapter</name>
        <config>
            <doit>true</doit>
        </config>
    </sample:adapter>
</app:config>

実行時に、Oracle Event Processingは、アダプタ・インスタンスのsetDoItメソッドをコールし、引数の値として値trueを渡します。

注意:

拡張コンポーネント構成スキーマでは、ネストされているconfig要素が必要です。

2.3.2 ライフサイクル・コールバック

アダプタまたはイベントBean実装では、メタデータ注釈を使用して、実行時にOracle Event Processingで起動されるJavaメソッドを指定できます。Oracle Event Processingは、構成Javaクラスのインスタンスを、指定したそれらのメソッドに渡します。これらのメソッドをプログラミングし、アダプタまたはイベントBeanについて特定の実行時の構成情報を取得できます。

次の例では、アダプタ構成が最初に有効化されたときに起動されるメソッドを指定するよう、@Activate注釈でactivateAdapterメソッドに注釈を付ける方法を示します。

@Activate
public void activateAdapter(HelloWorldAdapterConfig adapterConfig) {
    this.message = adapterConfig.getMessage();
}

デフォルトでは、アダプタ構成のJavaクラスのデータ型はcom.bea.wlevs.configuration.application.DefaultAdapterConfigです。構成XMLファイルを記述する独自のXSDファイルを作成してアダプタ(またはイベントBean)の構成を拡張した場合は、XSDファイルで型を指定します。上記の例では、Java構成オブジェクトのデータ型はcom.bea.wlevs.example.helloworld.HelloWorldAdapterConfigです。

2.3.3 ライフサイクル・コールバック注釈

次のメタデータ注釈を使用して、ライフサイクル・コールバック・メソッドを指定できます。

  • com.bea.wlevs.management.Activate: 構成がアクティブ化されたときに起動されるメソッドを指定します。

  • com.bea.wlevs.management.Prepare: 構成が準備されたときに起動されるメソッドを指定します。

  • com.bea.wlevs.management.Rollback: 例外が原因でアダプタが停止した場合に起動されるメソッドを指定します。

2.3.4 アダプタおよびイベントBeanのライフサイクル

Oracle Event Processingでは、アダプタおよびイベントBean作成のために次のライフサイクルを使用します。

  1. アダプタまたはイベントBeanインスタンスを作成します。

  2. 静的プロパティをインジェクトします。

  3. afterPropertiesSetメソッドをコールします。

  4. フェーズを準備します。

    1. 1つ以上の構成引数のある@Prepareがある場合は、これを呼び出します。ない場合は、構成プロパティを直接インジェクトします。

    2. 引数のない@Prepareがある場合は、これを呼び出します。

  5. フェーズをアクティブ化します。

    1. 1つ以上の構成引数のある@Activateがある場合は、これを呼び出します。

    2. 引数のない@Activateがある場合は、これを呼び出します。

  6. afterConfigurationActiveを呼び出します。

  7. その他の構成で続行します。