在「OSGi 宣告式服務」中宣告您的服務

您可以利用個別 XML 檔來宣告軟體組內的每個服務。

關於這項作業

「宣告式服務 (DS)」支援操作宣告式元件,每個宣告式元件都由軟體組中的一個 XML 檔來定義。 當包含元件宣告的軟體組新增到架構中,DS 會讀取各項元件宣告,將提供的服務登錄在服務登錄中。 之後,DS 會管理元件的生命週期:根據宣告的屬性及符合的相依關係之組合來控制它的生命週期。

元件的 XML 說明使 DS 無需元件的實例化或載入其實作類別,就能解析服務相依關係。 這有利於延遲而緩慢的資源載入,有助於改進伺服器的啟動及縮減執行時期的記憶體覆蓋區。

說明元件的 XML 檔利用 Service-Component 標頭列在軟體組的 MANIFEST.MF 檔中,依照慣例,會放在軟體組的 /OSGI-INF 目錄中。

若干工具可用來產生所需要的 XML;下列範例顯示 XML 本身。

這個主題說明利用 XML 在 DS 中宣告其元件的簡式 OSGi 軟體組。

程序

  1. 透過元件的實作類別名稱來識別您的元件。
    <component>
      <implementation class="com.example.bundle.HelloComponent"/>
    </component>
  2. 參照服務所提供的介面名稱來宣告服務。 當啟動軟體組時,這是 DS 發佈到服務登錄的名稱。
    <component>
      <implementation class="com.example.bundle.HelloComponent"/>
      <service>
         <provide interface="com.example.HelloService"/>
      	  </service>
    </component>
  3. 將元件命名。 元件名稱也充當服務的「持續身分」或 PID,用來將配置內容與服務關聯起來。 啟動之時,以及每當更新內容之時,都會將含有相符 PID 的配置內容注入元件中。
    <component name="HelloService">
      <implementation class="com.example.bundle.HelloComponent"/>
      <service>
        <provide interface="com.example.HelloService"/>
      	  </service>
    </component>
    註: 在 Liberty 設定檔中,使用者可以新增下列元素到 server.xml 配置檔中,內容會注入 HelloComponent 類別中。
    <HelloService firstKey="firstValue" secondKey="secondValue" />
  4. 將 XML 檔包裝在軟體組中。
    比方說,XML 檔位於 OSGI-INF/HelloService.xml,您新增一個標頭到軟體組資訊清單檔 MANIFEST.MF 中,讓 DS 能夠找到這個檔案:
    Service-Component: OSGI-INF/HelloService.xml
    如果將多個元件包裝在相同軟體組中,就必須用以逗點區隔的清單來輸入對應的 XML 檔。 例如:
    Service-Component: OSGI-INF/HelloService.xml, OSGI-INF/GoodbyeService
  5. HelloService 元件的 Java™ 實作如下:
    package com.example.bundle;
    
    import com.example;
    import org.osgi.service.component.ComponentContext;
    
    /*
     * 這個類別必須是公用的,且必須有一個公用的預設建構子,* DS 才能使用它。這個類別不需要從軟體組匯出。
     */
    public class HelloComponent implements HelloService {
    	/**
    	 * 選用項目:啟動這個元件的 DS 方法。如果這個方法存在,
      * 當啟動元件時,會呼叫它。最佳作法:這應該是一個
      * protected 方法,而不是 public 或 private
    	 * 
    	 * @param properties
    	 *           :包含配置管理所移入/提供之
    	 *            服務和配置內容的對映
    	 */
    	protected void activate(ComponentContext cContext, Map<String, Object> properties) {
    		modified(properties);
    	}
    
    	/**
    	 * 選用項目:停用這個元件的 DS 方法。如果這個方法存在,
      * 當停用元件時,會呼叫它。最佳作法:這應該是一個
      * protected 方法,而不是 public 或 private
    	 * 
    	 	 * @param reason
    	 	 *            元件停止之原因的 int 表示法
    	 */
    	protected void deactivate(ComponentContext cContext, int reason) {
    	}
    
    	/**
    	 	 * 選用項目:修改配置內容的 DS 方法。這可以由
      * 多個執行緒來呼叫:配置管理更新可以非同步地
      * 處理。這由 activate 方法來呼叫,否則,是
      * 在啟動元件而修改配置內容時呼叫。
    	 * 
    	 * @param properties
    	 */
    	public synchronized void modified(Map<String, Object> properties) {
    				// 在這裡處理配置內容
    	}
    
    	/**
    	 	 * com.example.HelloService 介面所定義的服務方法
    	 */
    		public void sayHello() {
    				System.out.println("Hello");
    	}
    }

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

資訊中心條款 | 意見


「時間戳記」圖示 前次更新: 2015 年 6 月 22 日
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=phil&product=was-libcore-mp&topic=twlp_declare_services_ds
檔名:twlp_declare_services_ds.html