一般來講,部署典型的 Web 應用程序一般包括先在集成測試環境中、而後在測試環境中、最後在生產環境中部署單個 .ear(或 .war)文件。特定於環境的變量對於在部署過程當中的每一個階段正確執行應用程序很是重要,這些變量能夠做爲鍵值對存儲在屬性文件中,做爲環境項存儲在 web.xml 文件中,或者做爲查詢值存儲在關係數據庫中。將這些應用程序變量存儲在關係數據庫中是否可取還有待於進一步論證。不過,將應用程序變量存儲在屬性文件中(或部署描述符中)須要在部署後修改屬性文件(或屬性描述符),以便爲每一個特定的環境修剪這些變量,或者編寫腳本,以便在應用程序包裝時使用不一樣的文件設置。無一例外,這些文件在不一樣的環境中是互不相同的。 java
在部署後修改部署的文件(屬性文件或 web.xml)可能容易出錯(在多節點集羣系統中進行修改更容易出錯),是否接受這一過程取決於組織的指導原則。無論怎樣,做爲這個一般不太常見情形的替代方法,您可使用 resource environment provider 避免和消除上面說起的問題:經過將這種依賴於應用程序的變量配置爲資源環境項,您可使用 Websphere Application Server 管理控制檯對它們進行管理,而無需再去修改部署的文件。 web
本文闡釋如何建立資源環境提供程序、可引用的對象和自定義屬性,如何在 Websphere Application Server 管理控制檯中管理自定義屬性,以及如何在應用程序中訪問這些屬性。 數據庫
本文假設您很是熟悉 Java™ 編程、Websphere Application Server V6 管理和 J2EE™ 技術。 編程
資源環境提供程序 緩存
Websphere Application Server Versions 5.x 和 6.x 支持對資源環境引用的引用,這相似於引用其餘已經支持的資源引用,如 DataSource 和 QueueConnection 工廠等,而且能夠經過 JNDI 查詢來訪問。儘管在 Websphere Application Server 中爲 DataSource、QueueConnection 工廠和其餘項目預約義了類,但您必須本身建立引用資源環境提供程序所需的類。 ide
至少須要如下兩個類才能在應用程序中使用資源環境提供程序:工廠類和提供自定義屬性的類。工廠類必須實現接口 javax.naming.spi.ObjectFactory。方法 getObjectInstance(...) 返回保存自定義屬性的類。藉助這兩個類和 Websphere Application Server 提供的管理支持,咱們能夠將在屬性文件(或部署描述符文件)中定義的屬性轉換爲託管變量,並經過 Websphere Application Server 管理控制檯管理它們。經過管理控制檯管理這些託管變量後,任何特定於環境的變量均可以經過控制檯進行管理,這樣就無需更改部署的屬性文件或建立特定於環境的屬性文件。使用此方法,每一個環境都將使用相同的部署文件。 測試
示例實現 spa
使用示例有助於解釋這些概念。咱們將看到的示例使用如下兩個類: code
清單 1 和清單 2 顯示了這兩個類的代碼。 xml
清單 1. ConfigFactory.java
package com.ibm.acme.ree.lib; import java.util.Enumeration; import java.util.Hashtable; import javax.naming.Context; import javax.naming.Name; import javax.naming.NamingException; import javax.naming.RefAddr; import javax.naming.Reference; import javax.naming.spi.ObjectFactory; public class ConfigFactory implements ObjectFactory { private static Config config = null; public Object getObjectInstance( Object object, Name name, Context nameCtx, Hashtable environment) throws NamingException { if(config == null) { config = new Config(); Reference ref = (Reference) object; Enumeration addrs = ref.getAll(); RefAddr addr = null; String entryName = null; String value = null; while (addrs.hasMoreElements()) { addr = (RefAddr) addrs.nextElement(); entryName = addr.getType(); value = (String) addr.getContent(); config.setAttribute(entryName, value); } } return config; } } |
package com.ibm.acme.ree.lib; import java.util.HashMap; import java.util.Map; public class Config { private Map attributes = null; public Config() { attributes = new HashMap(10); } protected void setAttribute(String attributeName, String attributeValue) { attributes.put(attributeName, attributeValue); } public Object getAttribute(String attributeName) { return attributes.get(attributeName); } } |
在 ConfigFactory.java(清單 1)中闡明瞭自定義屬性的緩存。根據應用程序要求,能夠將屬性設置爲動態的,從而避免在上面的代碼中進行緩存。