扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
引言
通常来说,部署典型的 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 管理控制台管理它们。通过管理控制台管理这些托管变量后,任何特定于环境的变量都可以通过控制台进行管理,这样就无需更改部署的属性文件或创建特定于环境的属性文件。使用此方法,每个环境都将使用相同的部署文件。
|
示例实现
使用示例有助于解释这些概念。我们将看到的示例使用以下两个类:
清单 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; } } |
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。
将库范围设置为 Cell,然后选择 New(图 1)。
输入库的名称:ree_lib
。
输入库的文本描述和类路径名称,然后选择 Apply(图 2)。
保存更改,完成库的创建。将列出新库,如图 3 所示
2. 创建资源环境提供程序
要创建资源环境提供程序,请执行以下操作:
从管理控制台选择 References => Resource Environment => Resource Environment Providers(图 4)。
将范围级别设置为 Cell,然后选择 New(图 5)。
将资源环境提供程序命名为 MyResourceEnvironmentProvider
,为资源输入描述,然后单击 OK(图 6)。
单击 Save 保存更改。
完成后,新创建的资源环境提供程序将在显示内容中列出(图 7)。
图 7. 可用的资源环境提供程序
3. 创建可引用的对象
“可引用的”对象是定义工厂类和保存自定义属性的类之间关系的对象。要创建可引用的对象,请执行以下操作:
从管理控制台展开 Resources => Resource References => Resource Environment Providers。
从资源环境提供程序面板(图 8)选择您刚才创建的提供程序 MyResourceEnvironmentProvider。
选择 Referenceables(图 9)。
单击 New。
使用前面定义的类 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 所示。
单击 Save 保存更改。
4. 创建资源环境项
|
资源环境项可以通过 JNDI 查询来访问引用的资源。要定义资源环境项,请执行以下操作:
从管理控制台展开 Resources => Resource Environment => Resource Environment Providers => MyResourceEnvironmentProvider。
选择 Resource environment entries(图 12)。
在下一个对话框中选择 New(图 13)。
在 Configuration 对话框(图 14)中,输入 Name (MyResourceReference
) 和 JNDI name (rep/dev/app1/MyResourceReference
) 的值。在应用程序部署资源引用映射的过程中使用此 JNDI 名称。
单击 OK,然后保存更改。
5. 创建自定义属性
要定义在应用程序中使用的自定义属性,请执行以下操作:
从管理控制台,展开并导航至 Resources => Resource Environment => Resource Environment Providers => MyResourceEnvironmentProvider => Resource Environment Entries => MyResourceReference。
选择 Custom properties(图 16)。
选择 New。(图 17)
输入 Name (MyVariable
)、Description、Type 和 Value 字段的值,然后单击 OK。(图 18)
您定义的自定义属性将出现在自定义属性列表中(图 19)。重复步骤 d 以添加其他变量。
注意,尽管 WebSphere Application Server 提供的向导缺省为 false,但是它不提供指定所需属性的选项。通过 WebSphere 管理脚本,您可以为所需属性指定值。如果您运行的是独立应用服务器,或者该应用服务器是集群中的成员,那么您定义的新资源将在重新启动应用服务器后可用。
6. 在 Web 模块中创建资源环境引用
与访问容器中的任何资源类似,要访问资源引用项,您必须在 Web 模块或 EJB 模块中适当地声明引用。要使用 IBM Rational® Application Developer 创建资源引用,请执行以下操作:
对于 Web 模块,请使用部署描述符编辑器打开 web.xml 文件(对于 EJB 模块,打开 ejb-jar.xml 文件)。
单击 References 选项卡,然后选择 Add(图 20)。
从 Add Reference 对话框,选择 Resource environment reference,然后单击 Next(图 21)。
输入 Name (MyConstants
)、Type 和 Description 的值,然后选择 Finish(图 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 } |
必须在应用程序的类路径中定义实现类,才能够实际使用您创建的资源环境提供程序。在应用程序部署时,通过映射共享库可以做到这一点。我们在这里不介绍完整的应用程序部署过程,但将介绍映射共享库的必要步骤:
在 Preparing for the application installation 对话框中,选择 WAR 文件,然后选中 Local file system 和 Show me all installation options,并单击 Next(图 23)。
继续执行应用程序部署过程,并在安装步骤 1、2 和 3 中选择缺省值(或根据自已的决定选择其他值)。在进行到步骤 4“Map Shared Libraries”(图 24)时,请选中您要选择的模块,然后单击 Reference shared libraries。
在 Enterprise Applications 对话框中,选择您要将其添加到应用程序类路径的库 ree_lib,然后单击 >> 按钮,向 Selected 列表添加选择的库。单击 OK。(图 25)
检查 Shared Libraries 栏,确保将库添加到了应用程序类路径,如图 26 所示。
继续执行应用程序部署过程。
在应用程序部署的步骤 5 中,将资源环境项引用映射到资源,将可引用的 JNDI 名称 (rep/dev/app1/MyResourceReference
) 输入到 Target Resource JNDI Name 字段。
继续执行应用程序部署过程。
部署了应用程序后,您需要测试应用程序对资源环境提供程序的使用情况。要完成此操作,首先需要重新启动应用程序。启动后,您可以容易地验证应用程序从资源环境项获取它的值,而不是从属性文件中定义的属性中或者从 web.xml 或 ejb-jar.xml 中定义的环境项中获取。只要需要,您可以通过从 WebSphere Application Server 管理控制台更改值并重新启动集群成员来更改此变量——所有这些操作均不会触及任何部署的文件,从而保留了整个应用程序及其处理环境的完整性。
|
结束语
本文讨论了资源环境项的使用,它是作为对特定于环境的应用程序变量使用属性文件或部署描述符文件的一种代替方法。本文还讨论了有关资源环境提供程序、可引用的对象、资源环境项和自定义属性的 WebSphere 实现的信息,并说明了在部署过程中映射共享库以及将资源环境项引用映射到资源。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者