您可以在預設的「Java™ 命名和目錄介面 (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。
- 當您的特性移除時,不需要明確地將物件與 JNDI 切斷連結,因為當軟體組停止時,OSGi 架構會自動取消登錄服務。
- 您可以使用宣告的服務或 ServiceFactory,輕易地實作緩慢起始設定,而不需使用 Reference 和 ObjectFactory。
如需 JNDI 的相關資訊,請參閱命名。
程序
- 使用 osgi.jndi.service.name 內容加上 JNDI 名稱,以登錄服務。 如需登錄服務的相關資訊,請參閱登錄 OSGi 服務。
- 更新您的 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 類型」的相關資訊,請參閱進階配置。
- 如果您需要 Java EE 資源參照資訊,請實作 ResourceFactory 介面。 如果您的服務需要 Java EE 資源參照資訊,例如 res-auth,您可以在 OSGi 服務登錄中,使用 jndiName 和 creates.objectClass 內容來登錄 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);
或者,可以自動使用宣告的服務和 Meta 類型來登錄服務。在該情況下,您可以指定 creates.objectClass 內容作為宣告的服務內容。您不需要指定 jndiName 內容,因為在步驟 2 中,已自動從使用者配置使用 metatype.xml 檔案中的 <AD id="jndiName"> 元素來設定此內容,而且您的 metatype.xml 檔案中不需要 <AD id="osgi.jndi.service.name> 元素,因為會自動重新登錄 ResourceFactory 服務。
- 使用 osgi.jndi.service.name 內容加上 JNDI 名稱,以尋找物件。 例如:
bundleContext.getServiceReference(DataSource.class, "(osgi.jndi.service.name=jdbc/myds)");
您也可以使用 jndiName 和 creates.objectClass 內容來尋找 ResourceFactory。
- 更新您的 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"/>