在 Liberty 特性中以 JNDI 預設名稱空間來開發

您可以在預設的「Java™ 命名和目錄介面 (JNDI)」名稱空間中使物件可供使用。如果要這麼做,您必須使用 osgi.jndi.service.name 服務內容,將其登錄在 OSGi 服務登錄中。osgi.jndi.service.name 的值是必要的 JNDI 名稱。同樣地,如果要在預設的 JNDI 名稱空間中尋找物件,您也可以使用 osgi.jndi.service.name 服務內容來搜尋 OSGi 服務登錄。osgi.jndi.service.name 的值是 JNDI 名稱。

關於這項作業

與明確地呼叫 Context.bindContext.lookup 相較,使用服務登錄具有下列優點:
  • jndi-1.0 啟用時,您的特性會適當運作,但不需要明確地相依於 JNDI。
  • 當您的特性移除時,不需要明確地將物件與 JNDI 切斷連結,因為當軟體組停止時,OSGi 架構會自動取消登錄服務。
  • 您可以使用宣告的服務或 ServiceFactory,輕易地實作緩慢起始設定,而不需使用 ReferenceObjectFactory

如需 JNDI 的相關資訊,請參閱命名

程序

  1. 使用 osgi.jndi.service.name 內容加上 JNDI 名稱,以登錄服務。 如需登錄服務的相關資訊,請參閱登錄 OSGi 服務
  2. 更新您的 metatype.xml,讓 JNDI 名稱能夠指定的在伺服器配置中。 如果要讓使用者指定服務的 JNDI 名稱,請使用 jndiName id,以便與 Liberty 執行時期中的其他特性保持一致,例如:
    <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 Meta 類型」的相關資訊,請參閱進階配置
  3. 如果您需要 Java EE 資源參照資訊,請實作 ResourceFactory 介面。 如果您的服務需要 Java EE 資源參照資訊,例如 res-auth,您可以在 OSGi 服務登錄中,使用 jndiNamecreates.objectClass 內容來登錄 ResourceFactoryResourceFactory 服務會自動使用 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);
    或者,可以自動使用宣告的服務和 Meta 類型來登錄服務。在該情況下,您可以指定 creates.objectClass 內容作為宣告的服務內容。您不需要指定 jndiName 內容,因為在步驟 2 中,已自動從使用者配置使用 metatype.xml 檔案中的 <AD id="jndiName"> 元素來設定此內容,而且您的 metatype.xml 檔案中不需要 <AD id="osgi.jndi.service.name> 元素,因為會自動重新登錄 ResourceFactory 服務。
  4. 使用 osgi.jndi.service.name 內容加上 JNDI 名稱,以尋找物件。 例如:
    bundleContext.getServiceReference(DataSource.class, "(osgi.jndi.service.name=jdbc/myds)");
    您也可以使用 jndiNamecreates.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"/>

指示主題類型的圖示 作業主題



「時間戳記」圖示 前次更新: 2016 年 11 月 30 日
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-libcore-mp&topic=twlp_feature_jndi
檔名:twlp_feature_jndi.html