在 WebSphere Application Server 中使用资源环境提供程序

通常,在 Web 应用程序中,特定于环境的变量或者作为键值对存储在属性文件中,或者作为环境项存储在 web.xml 文件中。这里存在的缺陷是,如果需要更改任何一个变量,则需要修改其中的某个文件,从而有可能导致错误——尤其是在跨多个节点分布文件的集群环境中。在 IBM® WebSphere® Application Server 中使用资源环境提供程序有助于避免在更改任何依赖于环境的变量时而更改部署的文件(从而避免对部署的应用程序的更改)。本文阐释如何使用资源环境提供程序,以及如何通过 WebSphere Application Server V6.x 中的管理控制台来管理依赖于应用程序或环境的变量。

Hara Totapally (hgtotapa@us.ibm.com ), 高级 IT 专家, IBM India Software Lab Services and Solutions

Hara Totapally 是位于加州的 IBM Costa Mesa 的高级 IT 专家,您可以通过 hgtotapa@us.ibm.com 与他联系。



2007 年 4 月 08 日

引言

通常来说,部署典型的 Web 应用程序通常包括先在集成测试环境中、然后在测试环境中、最后在生产环境中部署单个 .ear(或 .war)文件。特定于环境的变量对于在部署过程中的每个阶段正确执行应用程序非常重要,这些变量可以作为键值对存储在属性文件中,作为环境项存储在 web.xml 文件中,或者作为查询值存储在关系数据库中。将这些应用程序变量存储在关系数据库中是否可取还有待于进一步论证。不过,将应用程序变量存储在属性文件中(或部署描述符中)需要在部署后修改属性文件(或属性描述符),以便为每个特定的环境修剪这些变量,或者编写脚本,以便在应用程序包装时使用不同的文件设置。无一例外,这些文件在不同的环境中是互不相同的。

在部署后修改部署的文件(属性文件或 web.xml)可能容易出错(在多节点集群系统中进行修改更容易出错),是否接受这一过程取决于组织的指导原则。不管怎样,作为这个通常不太常见情形的替代方法,您可以使用 resource environment provider 避免和消除上面提及的问题:通过将这种依赖于应用程序的变量配置为资源环境项,您可以使用 WebSphere Application Server 管理控制台对它们进行管理,而无需再去修改部署的文件。

本文阐释如何创建资源环境提供程序、可引用的对象和自定义属性,如何在 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 工厂和其他项目预定义了类,但您必须自己创建引用资源环境提供程序所需的类。

至少需要以下两个类才能在应用程序中使用资源环境提供程序:工厂类和提供自定义属性的类。工厂类必须实现接口 javax.naming.spi.ObjectFactory。方法 getObjectInstance(...) 返回保存自定义属性的类。借助这两个类和 WebSphere Application Server 提供的管理支持,我们可以将在属性文件(或部署描述符文件)中定义的属性转换为托管变量,并通过 WebSphere Application Server 管理控制台管理它们。通过管理控制台管理这些托管变量后,任何特定于环境的变量都可以通过控制台进行管理,这样就无需更改部署的属性文件或创建特定于环境的属性文件。使用此方法,每个环境都将使用相同的部署文件。


示例实现

使用示例有助于解释这些概念。我们将看到的示例使用以下两个类:

  • ConfigFactory
  • Config

清单 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. 创建共享库
  2. 创建资源环境提供程序
  3. 创建可引用的对象。
  4. 创建资源环境项。
  5. 创建自定义属性。
  6. 在 Web 模块中创建资源环境引用。

在接下来的部分中将阐述这些步骤。

1. 创建共享库

创建简单的共享库,以便将类用于服务器上承载的所有应用程序。WebSphere Application Server 提供执行以下操作的向导:

  1. 编译两个类:Config.java 和 ConfigFactory.java,并创建名为 reelib.jar 的 JAR 文件。

  2. 将 JAR 文件复制到您选择的位置,如 C:\temp\。

  3. 从 WebSphere Application Server 管理控制台,展开 Environment => Shared Libraries

  4. 将库范围设置为 Cell,然后选择 New(图 1)。

    图 1. 设置共享库范围
    图 1. 设置共享库范围
  5. 输入库的名称:ree_lib

  6. 输入库的文本描述和类路径名称,然后选择 Apply(图 2)。

    图 2. 定义共享库
    图 2. 定义共享库
  7. 保存更改,完成库的创建。将列出新库,如图 3 所示

    图 3. 可用的共享库列表
    图 3. 可用的共享库列表

2. 创建资源环境提供程序

要创建资源环境提供程序,请执行以下操作:

  1. 从管理控制台选择 References => Resource Environment => Resource Environment Providers(图 4)。

    图 4. 创建资源环境提供程序
    图 4. 创建资源环境提供程序
  2. 将范围级别设置为 Cell,然后选择 New(图 5)。

    图 5. 创建新的资源环境提供程序
    图 5. 创建新的资源环境提供程序
  3. 将资源环境提供程序命名为 MyResourceEnvironmentProvider,为资源输入描述,然后单击 OK(图 6)。

    图 6. 定义资源环境提供程序
    图 6. 定义资源环境提供程序
  4. 单击 Save 保存更改。

完成后,新创建的资源环境提供程序将在显示内容中列出(图 7)。

图 7. 可用的资源环境提供程序
图 7. 可用的资源环境提供程序

3. 创建可引用的对象

“可引用的”对象是定义工厂类和保存自定义属性的类之间关系的对象。要创建可引用的对象,请执行以下操作:

  1. 从管理控制台展开 Resources => Resource References => Resource Environment Providers

  2. 从资源环境提供程序面板(图 8)选择您刚才创建的提供程序 MyResourceEnvironmentProvider

    图 8. 选择资源环境提供程序
    图 8. 选择资源环境提供程序
  3. 选择 Referenceables(图 9)。

    图 9. 资源环境提供程序详细信息
    图 9. 资源环境提供程序详细信息
  4. 单击 New。

  5. 使用前面定义的类 com.ibm.acme.ree.lib.ConfigFactory 和 com.ibm.acme.ree.lib.Config 创建可引用的对象。在 Referenceables 对话框(图 10)中,输入工厂类 (com.ibm.acme.ree.lib.ConfigFactory) 和类名 (com.ibm.acme.ree.lib.Config) 的完全限定类名,然后选择 OK。然后将显示定义的可引用对象,如图 11 所示。

    图 10. 定义可引用的对象
    图 10. 定义可引用的对象
    图 11. 定义的可引用对象
    图 11. 定义的可引用对象
  6. 单击 Save 保存更改。

4. 创建资源环境项

关于变量名
如果您使用其他名称定义这些示例中使用之外的某些元素,则确保记录它们并在这些说明中的适当位置替代它们。

资源环境项可以通过 JNDI 查询来访问引用的资源。要定义资源环境项,请执行以下操作:

  1. 从管理控制台展开 Resources => Resource Environment => Resource Environment Providers => MyResourceEnvironmentProvider

  2. 选择 Resource environment entries(图 12)。

    图 12. 资源环境提供程序详细信息
    图 12. 资源环境提供程序详细信息
  3. 在下一个对话框中选择 New(图 13)。

    图 13. 创建新的资源环境项
    图 13. 创建新的资源环境项
  4. 在 Configuration 对话框(图 14)中,输入 Name (MyResourceReference) 和 JNDI name (rep/dev/app1/MyResourceReference) 的值。在应用程序部署资源引用映射的过程中使用此 JNDI 名称。

    图 14. 配置资源环境项
    图 14. 配置资源环境项
  5. 单击 OK,然后保存更改。

    图 15. 定义的资源环境项
    图 15. 定义的资源环境项

5. 创建自定义属性

要定义在应用程序中使用的自定义属性,请执行以下操作:

  1. 从管理控制台,展开并导航至 Resources => Resource Environment => Resource Environment Providers => MyResourceEnvironmentProvider => Resource Environment Entries => MyResourceReference

  2. 选择 Custom properties(图 16)。

    图 16. 选择自定义属性
    图 16. 选择自定义属性
  3. 选择 New。(图 17)

    图 17. 创建新的自定义属性
    图 17. 创建新的自定义属性
  4. 输入 Name (MyVariable)、Description、Type 和 Value 字段的值,然后单击 OK。(图 18)

    图 18. 定义自定义属性
    图 18. 定义自定义属性
    图 19. 定义的自定义属性
    图 19. 定义的自定义属性
  5. 您定义的自定义属性将出现在自定义属性列表中(图 19)。重复步骤 d 以添加其他变量。

注意,尽管 WebSphere Application Server 提供的向导缺省为 false,但是它不提供指定所需属性的选项。通过 WebSphere 管理脚本,您可以为所需属性指定值。如果您运行的是独立应用服务器,或者该应用服务器是集群中的成员,那么您定义的新资源将在重新启动应用服务器后可用。

6. 在 Web 模块中创建资源环境引用

与访问容器中的任何资源类似,要访问资源引用项,您必须在 Web 模块或 EJB 模块中适当地声明引用。要使用 IBM Rational® Application Developer 创建资源引用,请执行以下操作:

  1. 对于 Web 模块,请使用部署描述符编辑器打开 web.xml 文件(对于 EJB 模块,打开 ejb-jar.xml 文件)。

  2. 单击 References 选项卡,然后选择 Add(图 20)。

    图 20. 部署描述符编辑器
    图 20. 部署描述符编辑器
  3. 从 Add Reference 对话框,选择 Resource environment reference,然后单击 Next(图 21)。

    图 21. 添加引用
    图 21. 添加引用
  4. 输入 Name (MyConstants)、Type 和 Description 的值,然后选择 Finish(图 22)。

    图 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
}

必须在应用程序的类路径中定义实现类,才能够实际使用您创建的资源环境提供程序。在应用程序部署时,通过映射共享库可以做到这一点。我们在这里不介绍完整的应用程序部署过程,但将介绍映射共享库的必要步骤:

  1. 在 Preparing for the application installation 对话框中,选择 WAR 文件,然后选中 Local file systemShow me all installation options,并单击 Next(图 23)。

    图 23. 准备用于部署的应用程序
    图 23. 准备用于部署的应用程序
  2. 继续执行应用程序部署过程,并在安装步骤 1、2 和 3 中选择缺省值(或根据自已的决定选择其他值)。在进行到步骤 4“Map Shared Libraries”(图 24)时,请选中您要选择的模块,然后单击 Reference shared libraries

    图 24. 显示共享映射库
    图 24. 显示共享映射库
  3. 在 Enterprise Applications 对话框中,选择您要将其添加到应用程序类路径的库 ree_lib,然后单击 >> 按钮,向 Selected 列表添加选择的库。单击 OK。(图 25)

    图 25. 选择共享库
    图 25. 选择共享库
  4. 检查 Shared Libraries 栏,确保将库添加到了应用程序类路径,如图 26 所示。

  5. 继续执行应用程序部署过程。

    图 26. 映射共享库
    图 26. 映射共享库
  6. 在应用程序部署的步骤 5 中,将资源环境项引用映射到资源,将可引用的 JNDI 名称 (rep/dev/app1/MyResourceReference) 输入到 Target Resource JNDI Name 字段。

  7. 继续执行应用程序部署过程。

    图 27. 指定资源环境项
    图 27. 指定资源环境项

部署了应用程序后,您需要测试应用程序对资源环境提供程序的使用情况。要完成此操作,首先需要重新启动应用程序。启动后,您可以容易地验证应用程序从资源环境项获取它的值,而不是从属性文件中定义的属性中或者从 web.xml 或 ejb-jar.xml 中定义的环境项中获取。只要需要,您可以通过从 WebSphere Application Server 管理控制台更改值并重新启动集群成员来更改此变量——所有这些操作均不会触及任何部署的文件,从而保留了整个应用程序及其处理环境的完整性。


结束语

本文讨论了资源环境项的使用,它是作为对特定于环境的应用程序变量使用属性文件或部署描述符文件的一种代替方法。本文还讨论了有关资源环境提供程序、可引用的对象、资源环境项和自定义属性的 WebSphere 实现的信息,并说明了在部署过程中映射共享库以及将资源环境项引用映射到资源。


致谢

作者非常感谢 IBM IT 架构师 Tom Bergman,他对本文进行了审阅,并提出了宝贵意见。

参考资料

学习

获得产品和技术

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=207275
ArticleTitle=在 WebSphere Application Server 中使用资源环境提供程序
publish-date=04082007