一般来说,部署典型的Web应用程序通常包括首先在集成测试环境中,然后在测试环境中,最后在生产环境中部署单个.ear(或.war)文件。 特定于环境的变量对于在部署过程的每个阶段正确执行应用程序都很重要,可以存储为属性中的键值对,web.xml中的env条目或关系数据库中的查找值。 将这些应用程序变量存储在关系数据库中是否是一个好主意,尚有待商debate。 但是,将应用程序变量存储在属性文件(或部署描述符)中,要求您在属性文件(或部署描述符)已经部署完毕后对其进行修改,以针对每个特定环境定制这些变量,或者编写脚本以使用不同的集合应用程序打包期间的文件数量。 在所有情况下,这些文件在不同环境中都必然有所不同。
尽管在部署后对部署的文件(属性文件或web.xml)进行更改可能容易出错(在多节点集群系统中进行更改甚至更容易出错),但是否可以接受此过程取决于您组织的情况。准则。 无论如何,作为这种通常不受欢迎的做法的替代方案,您都可以使用资源环境提供程序来避免并消除上述问题:通过将此类依赖于应用程序的变量配置为资源环境条目,可以使用WebSphere Application Server管理控制台来管理它们- -无需诉诸于修改已部署的文件。
本文介绍了如何创建资源环境提供程序,可引用对象和定制属性,以及如何在WebSphere Application Server管理控制台中管理定制属性,以及如何在应用程序中访问这些属性。
本文假定您对Java™编程,WebSphere Application Server V6管理和J2EE™技术有很好的了解。
资源环境提供者
WebSphere Application Server版本5.x和6.x支持资源环境引用的引用,这类似于引用其他已经支持的资源引用,例如DataSource,QueueConnection工厂等,并且可以通过JNDI查找进行访问。 虽然在WebSphere Application Server中预定义了DataSource,QueueConnection工厂和其他类,但是您必须自己创建引用资源环境提供程序所需的类。
至少需要两个类才能在应用程序中使用资源环境提供程序:工厂类和提供自定义属性的类。 强制工厂类实现接口javax.naming.spi.ObjectFactory。 方法getObjectInstance(...)返回包含自定义属性的类。 借助于这两个类以及WebSphere Application Server提供的管理支持,我们可以将在属性文件(或部署描述符文件)中定义的属性转换为托管变量,并通过WebSphere Application Server管理控制台对其进行管理。 一旦可以通过管理控制台管理这些托管变量,就可以通过控制台管理任何特定于环境的变量,并且无需更改已部署的属性文件或创建特定于环境的属性文件。 通过这种方法,每个环境都使用相同的已部署文件。
实施范例
一个例子将有助于解释这些概念。 我们将看的示例使用两个类:
- ConfigFactory
- 设定档
清单1和清单2显示了这两个代码。
清单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;
}
}
清单2. Config.java
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)中说明了自定义属性的缓存。 根据应用程序的要求,可以使属性动态化,从而避免上述代码中的缓存。
要在Web应用程序中创建和使用资源环境提供程序,您需要:
以下各节说明了这些步骤。
1.创建一个共享库
创建一个简单的共享库,以便这些类可用于服务器上托管的所有应用程序。 WebSphere Application Server提供了执行此操作的向导:
编译Config.java和ConfigFactory.java这两个类,并创建一个名为
reelib.jar
的JAR文件。将JAR文件复制到您选择的位置,例如C:\ temp \。
在WebSphere Application Server管理控制台中,展开Environment => Shared Libraries 。
-
将库Scope设置为Cell ,然后选择New (图1)。
图1.设置共享库范围
输入库的名称:
ree_lib
。-
输入库的文本描述和类路径名称,然后选择应用 (图2)。
图2.定义共享库
-
保存更改以完成库创建。 新库将被列出,如图3所示。
图3.可用的共享库清单
2.创建资源环境提供程序
要创建资源环境提供程序:
-
从管理控制台中,选择References => Resource Environment => Resource Environment Providers (图4)。
图4.创建资源环境提供者
-
将范围级别设置为Cell ,然后选择New (图5)。
图5.创建新的资源环境提供者
-
将资源环境提供程序命名为
MyResourceEnvironmentProvider
,为资源输入一个Description,然后单击OK (图6)。图6.定义资源环境提供者
保存更改。
完成后,新创建的资源环境提供程序将显示在显示屏中(图7)。
图7.可用资源环境提供者
3.创建一个可引用的对象
“可引用”是定义工厂类和具有定制属性的类之间的关系的对象。 要创建可引用的对象:
在管理控制台中,展开资源=>资源引用=>资源环境提供程序 。
-
从“资源环境提供程序”面板(图8)中,选择刚刚创建的提供程序MyResourceEnvironmentProvider 。
图8.选择资源环境提供者
-
选择Referenceables (图9)。
图9.资源环境提供者详细信息
点击新建。
-
先前定义的类com.ibm.acme.ree.lib.ConfigFactory和com.ibm.acme.ree.lib.Config用于创建Referenceable。 在Referenceables对话框(图10)上,为Factory类(
com.ibm.acme.ree.lib.ConfigFactory
)和类名(com.ibm.acme.ree.lib.Config
)输入标准类名,然后选择OK。 。 然后将显示已定义的引用对象,如图11所示。图10.定义可引用
图11.定义的可引用对象
保存更改。
4.创建资源环境条目
资源环境条目允许通过JNDI查找通过引用访问资源。 要定义资源环境条目:
在管理控制台中,展开资源=>资源环境=>资源环境提供者=> MyResourceEnvironmentProvider 。
-
选择资源环境条目 (图12)。
图12.资源环境提供者详细信息
-
在下一个对话框中,选择New (图13)。
图13.创建新的资源环境条目
-
在Configuration对话框(图14)上,输入Name(
MyResourceReference
)和JNDI name(rep/dev/app1/MyResourceReference
)的值。 此JNDI名称在应用程序部署资源引用映射期间使用。图14.配置资源环境条目
-
单击确定 ,然后保存更改。
图15.定义的资源环境条目
5.创建自定义属性
定义将在应用程序中使用的自定义属性:
在管理控制台中,展开导航至“ 资源=>资源环境=>资源环境提供者=> MyResourceEnvironmentProvider =>资源环境条目=> MyResourceReference” 。
-
选择定制属性 (图16)。
图16.选择定制属性
-
选择新建 。 (图17)
图17.创建新的定制属性
-
输入名称(
MyVariable
),描述,类型和值字段的值,然后单击确定。 (图18)图18.定义定制属性
图19.定义的定制属性
您定义的定制属性将显示在定制属性列表中(图19)。 重复步骤d,添加其他变量。
请注意,尽管WebSphere Application Server提供的向导默认为false,但是它没有提供用于指定必需属性的选项。 通过WebSphere管理员脚本,您可以为必需的属性指定一个值。 如果您正在运行独立的应用程序服务器,或者它是集群中的成员,则重新启动应用程序服务器后,您定义的新资源将可用。
6.在Web模块中创建资源环境参考
与访问容器中的任何资源类似,要访问资源引用条目,必须根据需要在Web模块或EJB模块中声明一个引用。 要使用IBMRational®Application Developer创建资源引用,请执行以下操作:
对于Web模块,使用部署描述符编辑器打开web.xml文件(对于EJB模块,打开ejb-jar.xml文件)。
-
单击References选项卡,然后选择Add (图20)。
图20.部署描述符编辑器
-
在Add Reference对话框中,选择Resource environment reference ,然后选择Next (图21)。
图21.添加参考
-
输入名称(
MyConstants
),类型和描述的值,然后选择完成 (图22)。图22.配置资源环境参考
使用资源环境提供者元素
清单3中的代码示例显示了如何访问可引用的和关联的定制属性。
清单3.访问自定义属性
try {
Context ctx = new InitialContext();
Object object =
ctx.lookup("java:comp/env/MyConstants");
Config config = (Config) config;
String myVariable = config.getProperty("MyVariable");
} catch (Exception e) {
// .. Handle Exception e
}
在实际使用您创建的资源环境提供程序之前,必须在应用程序的类路径中定义实现类。 这可以通过在应用程序部署时映射共享库来完成。 我们不会在此处显示完整的应用程序部署过程,但是将显示映射共享库的必要步骤:
-
在“准备安装应用程序”对话框中,选择您的WAR文件,然后选中“ 本地文件系统”并显示“所有安装选项” ,然后单击“ 下一步” (图23)。
图23.准备要部署的应用程序
-
通过安装步骤1、2和3继续应用程序部署过程,选择默认值(或其他值,由您决定)。当到达步骤4:映射共享库(图24)时,检查所需的模块。选择,然后单击“ 引用共享库” 。
图24.显示共享地图库
-
在“企业应用程序”对话框上,选择要添加到应用程序的类路径ree_lib的库 ,然后单击>>按钮以将选定的库添加到“选定的列表”。 单击确定 。 (图25)
图25.选择共享库
通过检查Shared Libraries列,确保将库添加到应用程序类路径,如图26所示。
-
继续进行应用程序部署过程。
图26.映射共享库
在应用程序部署的第5步中,将资源环境条目映射到资源,在目标资源JNDI名称字段中输入可引用对象的JNDI名称(
rep/dev/app1/MyResourceReference
)。-
继续进行应用程序部署过程。
图27.指定资源环境条目
部署应用程序之后,您将需要测试应用程序对资源环境提供程序的使用。 为此,您需要首先重新启动应用程序。 启动后,您可以轻松地验证应用程序是从资源环境条目中获取其值,而不是从属性文件中定义的属性或从web.xml或ejb-jar.xml中定义的环境条目中获取其值。 无论何时需要,您都可以通过从WebSphere Application Server管理控制台更改值并重新启动集群成员来更改此变量-所有这些都无需触摸任何已部署的文件,即可保持整个应用程序及其处理环境的完整性。
结论
本文讨论了如何使用资源环境条目来替代将属性文件或部署描述符文件用于特定于环境的应用程序变量。 讨论了有关WebSphere环境中资源环境提供程序的实现,可引用对象,资源环境条目和定制属性的信息,以及有关在部署过程中映射共享库以及将资源环境条目引用映射到资源的说明。
致谢
作者衷心感谢IBM IT架构师Tom Bergman对本文的审阅和评论。
翻译自: https://www.ibm.com/developerworks/websphere/library/techarticles/0611_totapally/0611_totapally.html