Liberty フィーチャー内の JDNI デフォルト名前空間を使用した開発

デフォルトの Java™ Naming and Directory Interface (JNDI) 名前空間でオブジェクトを使用可能にすることができます。そのためには、osgi.jndi.service.name サービス・プロパティーを使用して OSGi サービス・レジストリーにそれを登録する必要があります。osgi.jndi.service.name の値は、必須の JNDI 名です。同様に、デフォルトの JNDI 名前空間でオブジェクトを検索するには、osgi.jndi.service.name サービス・プロパティーを使用して OSGi サービス・レジストリー内を検索することができます。osgi.jndi.service.name の値は JNDI 名です。

このタスクについて

Context.bind または Context.lookup を明示的に呼び出す場合と比較して、サービス・レジストリーを使用した場合、次のような利点があります。
  • jndi-1.0 が使用可能になっている場合フィーチャーは正しく機能しますが、フィーチャーは JNDI への明示的依存を必要としません。
  • バンドルが停止した時に OSGi フレームワークが自動的にサービスを登録解除するため、フィーチャーを削除した時に JNDI からオブジェクトを明示的にアンバインドする必要がありません。
  • Reference および ObjectFactory を使用するのではなく、宣言サービスまたは ServiceFactory を使用して、遅延初期化を容易に実装することができます。

JNDI ついて詳しくは、『ネーミング』を参照してください。

手順

  1. osgi.jndi.service.name プロパティーにJNDI 名を使用してサービスを登録します。 サービスの登録について詳しくは、『OSGi サービスの登録』を参照してください。
  2. metatype.xml を更新して、JNDI 名をサーバー構成に指定できるようにします。 ユーザーがサービスの JNDI 名を指定できるようにするには、Liberty ランタイム内の他のフィーチャーとの整合性のために jndiName id を使用します。例えば、次のようになります。
    <AD id="jndiName" name="JNDI name" description="JNDI name for a widget." type="String" ibm:unique="jndiName"/>
    内部属性を使用して、jndiName 属性の値で自動的に osgi.jndi.service.name サービス・プロパティーを設定することができます。例えば、次のようになります。
    <AD id="osgi.jndi.service.name" name="internal" description="internal" type="String" default="${jndiName}"/>
    OSGi メタタイプについて詳しくは、『拡張構成』を参照してください。
  3. Java EE リソース参照情報が必要な場合は、ResourceFactory インターフェースを実装します。 ご使用のサービスに、res-auth などの Java EE リソース参照情報が必要な場合は、jndiName プロパティーと creates.objectClass プロパティーを使用して OSGi サービス・レジストリーに ResourceFactory を登録することができます。ResourceFactory サービスは、osgi.jndi.service.name プロパティーを使用して自動的に再登録されます。 以下に例を示します。
    import com.ibm.wsspi.resource.ResourceFactory;
        public class WidgetResourceFactory implements ResourceFactory { ... }
    
        Properties properties = new Properties();
        properties.put(ResourceFactory.JNDI_NAME, "widget/abc");
        properties.put(ResourceFactory.CREATES_OBJECT_CLASS, Widget.class.getName());
        bundleContext.registerService(ResourceFactory.class, new WidgetResourceFactory(), properties);
    あるいは、宣言サービスおよびメタタイプを使用して、サービスを自動的に登録することができます。その場合は、creates.objectClass プロパティーを宣言サービス・プロパティーとして指定することができます。jndiName プロパティーは、ステップ 2metatype.xml ファイルの <AD id="jndiName"> エレメントによってユーザー構成から自動的に設定されるため、指定する必要はありません。また、ResourceFactory サービスは自動的に再登録されるため、metatype.xml ファイル内の <AD id="osgi.jndi.service.name> エレメントは必要ありません。
  4. JNDI 名を指定した osgi.jndi.service.name プロパティーを使用してオブジェクトを見つけます。 以下に例を示します。
    bundleContext.getServiceReference(DataSource.class, "(osgi.jndi.service.name=jdbc/myds)");
    あるいは、jndiName プロパティーと creates.objectClass プロパティーを使用して ResourceFactory を見つけることができます。
  5. metatype.xml を更新して、リソースの ID を使用して server.xml にリソースを指定できるようにします。こうすると、リソースが jndiName を持っているかどうかに関係なく、リソースにアクセスすることができます。 以下に例を示します。
    <AD id="dataSourceRef" type="String" ibm:type="pid" ibm:reference="com.ibm.ws.jdbc.dataSource"
     cardinality="1" name="%dataSourceRef" description="%dataSourceRef.desc"/>
    宣言サービスを使用している場合は、内部属性を使用してフィルターと共に .target サービス・プロパティーを設定することができます。例えば、宣言サービス・コンポーネントが、dataSource という名前の参照を持っている場合、以下の属性定義を使用して、dataSourceRef 構成属性によって参照される dataSource が確実に使用されるようにすることができます。
    <AD id="dataSource.target" type="String" default="(service.pid=${dataSourceRef})" ibm:final="true" name="internal" description="internal"/>

トピックのタイプを示すアイコン タスク・トピック

ファイル名: twlp_feature_jndi.html