您的位置:首页 > 移动开发

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

2013-05-16 00:00 423 查看
通常来说,部署典型的 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)中阐明了自定义属性的缓存。根据应用程序要求,可以将属性设置为动态的,从而避免在上面的代码中进行缓存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐