John Chang, 顾问软件工程师, IBM
Amy Lin, 软件工程师, IBM
Vishwanath Venkataramappa, 高级软件工程师, IBM
Syed-Muasir Khalil, 软件工程师, IBM
IBM WebSphere Application Server 配置主要由 XML 格式文件以及一些非 XML 格式文件组成。这些配置文件分布在 WebSphere Application Server 安装或配置树的多个目录中。这些文件的内容是以特定于 WebSphere 的格式构造的,目的是为了遵循基础配置模型。
可以使用许多管理工具(如 wsadmin 命令、管理控制台和公共 Java™ API)访问和操作这些配置对象。每种工具都提供独特的任务来修改配置的不同部分。例如,wsadmin 包含 AdminConfig、AdminTask、AdminApp 和 AdminControl 任务,用于查询和修改 WebSphere Application Server 配置中的不同对象。利用这些 wsadmin 功能以及其他可用的 wsadmin 功能通常要求管理员全面了解所有可用的任务。
WebSphere Application Server V7.0 引入了简单的基于属性文件的配置功能,可以将其用作单个常规工具来查询和修改 WebSphere Application Server 配置中的配置对象。使用此实用工具,可以检查配置并通过将配置元素提取到可读的属性文件中来更新配置,根据需要修改提取的属性文件,然后将修改应用回配置。归根结底,这意味着您现在只需知道一个命令集(而不是每个工具一组命令集),就能配置 WebSphere Application Server。
本文将提供一些示例来演示如何将 WebSphere Application Server 配置信息提取到简单的属性文件,如何修改提取的属性文件,最后,将演示如何将修改应用回 WebSphere Application Server 配置。
基于属性的配置能够将环境配置为与属性文件中指定的内容相匹配。属性文件通过从现有配置提取属性名称和值来创建。通过在文件中修改、添加或删除对象和属性可以配置环境,然后通过调用 apply 和 delete 命令将属性文件应用到配置中。
属性文件包含属性名称和属性值对的列表。可以使用此数据配置计算单元、节点、集群、服务器、应用程序或任何其他配置对象。不过,属性文件不是配置文件,因此,在使用基于属性文件的配置将此文件应用到配置之前,对此文件的修改不会影响系统的配置。
基于属性的配置可以在 WebSphere Application Server 配置存储库中的复杂数据,及包含相应配置信息的基于属性的简单文件格式之间提供双向转换。使用基于属性文件的配置能够:
- 从配置存储库提取数据来创建属性文件。
- 根据需要更新属性文件以操作配置。
- 将属性文件中的更新数据应用到目标配置存储库。
可以将 WebSphere Application Server 配置提取到单个文件,并将任何配置属性以名称/值对属性的形式放入该文件中。而现有工具(如 wsadmin 或管理控制台)要求您调用特定的命令或导航多个面板才能获得所需的配置属性,此新增功能实用工具使您能够通过将其提取到一个属性文件来获得整个配置,甚至可以仅提取配置对象及其属性的一个实例。
使用基于属性的配置的两个主要优点是:
- 将配置数据与 WebSphere Application Server 不同版本之间的基础配置和对象模型更改相分离。
- 与分布在多个配置存储库的 XML 和其他格式的混合相比,管理人员使用属性文件更方便。
因此,该工具可以进行从属性文件配置数据到该版本的基础配置模型的正确转换,并提供在不同版本中使用同一配置数据的灵活性。也许更为重要的是,可以将配置的新增更改指定为属性文件的一部分并快速应用,而无需了解基础配置或对象模型。为了更易于使用,您可以使用一个命令(该命令可以应用属性文件中指定的配置属性)将工作配置快速地应用到另一个系统,而无需使用需要调用多个命令才能达到类似结果的其他工具,如 wsadmin。
基于属性的配置不是替代配置存档工具,而是对它们的补充。从配置提取的属性仅包含最常用的配置属性,而不包含整个配置。但是,配置存档包含一个精确的配置副本,并可以应用到另一个系统以实现精确复制。由于属性文件仅包含最常用的关键属性,因此在导入存档后,可以将此工具与配置存档结合使用以进行任何必要的配置更改。
基于属性文件的配置可实现为 AdminCommand 集,如下表所示。可以在 wsadmin 或 Java 客户端程序中使用这些命令。(在 WebSphere Application Server V7.0 中对基于属性的配置不提供任何管理控制台支持。)
| 命令 | 描述 | 目标对象 | 参数 | 返回值 |
|---|---|---|---|---|
| extractConfigProperties | 以简单的属性文件的形式提取配置数据。如果未指定配置对象,则将整个配置文件的配置数据提取到属性文件。将所有特定于环境的值(cellName、serverName、nodeName、clusterName、coreGroup、nodeGroup、authorizationGroup 等)表示为变量。这些变量存储在生成的属性文件的末尾。 | 配置对象的 Configld如果使用 configData 参数,则不需要它。 |
|
使用配置属性填充的 propertiesFile |
| 示例:
交互模式 (Jython): 批处理模式 (Jython): | ||||
表 2. applyConfigProperties
| 命令 | 描述 | 目标对象 | 参数 | 返回值 |
|---|---|---|---|---|
| applyConfigProperties | 将属性文件中指定的属性应用到配置。使用新值修改与属性文件中指定的每个属性对应的属性。如果配置中不存在与指定的属性对应的属性,则在配置中创建新属性。如果配置中不存在属性文件中指定的配置对象,则创建新的配置对象。 | 无 |
|
无 |
| 示例:
交互模式 (Jython): 批处理模式 (Jython): | ||||
表 3. validateConfigProperties
| 命令 | 描述 | 目标对象 | 参数 | 返回值 |
|---|---|---|---|---|
| validateConfigProperties | 验证属性文件中指定的属性。此命令将验证每个属性,以确保在配置上应用属性时不发生任何错误。还将验证语法并检查类型是否正确。将属性文件中的所有错误记录到指定的报告文件。还将记录以下信息:将创建哪些配置对象、将修改哪些配置对象等。 | 无 |
|
无 |
| 示例:
交互模式 (Jython): 批处理模式 (Jython): | ||||
表 4. deleteConfigProperties
| 命令 | 描述 | 目标对象 | 参数 | 返回值 |
|---|---|---|---|---|
| deleteConfigProperties | 从配置删除属性文件中指定的属性。移除属性文件中每个属性的属性。如果属性具有缺省值,则将属性值设置为缺省值。 | 无 |
|
无 |
| 示例:
交互模式 (Jython): 批处理模式 (Jython): | ||||
表 5. createPropertiesFileTemplates
| 命令 | 描述 | 目标对象 | 参数 | 返回值 |
|---|---|---|---|---|
| createPropertiesFileTemplates | 创建可用于创建或删除指定对象类型的实例的模板属性文件。 | 无 |
|
无 |
| 示例:
交互模式 (Jython): 批处理模式 (Jython): | ||||
由于属性文件可包含多个配置对象的属性,并且每个配置对象可包含多个属性,因此将属性文件划分为多个部分。每个部分包含一个配置对象的属性。每个部分包含一个部分标题,后跟名称/值属性对。部分标题标识配置对象,属性部分包含配置对象的属性。
清单 1 显示了属性文件的示例,该文件显示了对象的标题和属性。
# # Section 1.0 ## cells/myCell|cell.xml#Cell_1 # # # SubSection 1.0 # Cell level attributes (Header) # ResourceType=Cell ImplementingResourceType=Cell ResourceId=Cell=!{cellName} # # #Properties section # cellType=DISTRIBUTED name=!{cellName} ... EnvironmentVariablesSection # #Environment Variables # cellName=MyCell |
属性文件标题包含:
- ResourceType,表示资源的类型。
- ResourceId,是唯一地标识资源或配置对象的名称。仅当需要将同一属性应用到同一类型的其他对象时才对它进行修改。
- ImplementingResourceType,表示实现属性到属性转换的类。
标题中的信息是自动生成的,只会修改 ResourceId。显示此信息,以便基于属性文件的配置工具知道使用哪些实现来调用和应用属性。
属性部分包含标题以名称/值对形式标识的配置对象的属性。每个名称和值都与配置对象的属性对应。
环境变量部分包含属性文件中使用的变量值。将特定于环境的属性(如 cellName、serverName、nodeName 等)表示为变量,并将这些变量的当前值放置在属性文件的末尾。
可以将多个参数和规则应用到属性文件来操作配置。下面是一些最常见和最重要的参数和规则:
-
复杂属性
正如前面描述的,属性文件包含多个部分。每个部分包含一个标识配置对象的部分标题,后跟属性。在大多数情况下,部分中的属性与配置对象的属性对应。不过,在其他情况下,可以将多个属性合并来形成单个属性,以减少生成的属性文件的大小。将多个属性合并以形成单个属性时,可使用标题中的 AttributeInfo 来描述合并多个属性的方式。清单 2 显示了如何将多个属性合并为单个属性的示例。
清单 2. 将多个属性合并为单个属性
# # Section 1.0.0 ## cells/myCell|virtualhosts.xml#VirtualHost_1 # # # SubSection 1.0 # Virtual Hosts # ResourceType=VirtualHost ImplementingResourceType=VirtualHost ResourceId=Cell=myCell:VirtualHost=ID#VirtualHost_1 # # #Properties # name=default_host ... # # SubSection 1.2 # HostAlias section # ResourceType=VirtualHost ImplementingResourceType=VirtualHost ResourceId==myCell:VirtualHost=ID#VirtualHost_1 AttributeInfo=aliases(port,hostname) # # #Properties # 9472=* 9443=* 9468=* 9096=* 80=* ...
标题部分中的 AttributeInfoin 包含将每个 HostAlias 映射到单个属性必需的信息 (port=hostname)。您无需了解系统如何在内部处理 AttributeInfo 以便将这些属性映射到配置属性,但是需要重点注意的是,一定不要从标题中删除该信息。要添加新的别名,只需在列表的末尾添加一个新条目;当应用属性文件时,将创建新的主机别名。
-
值列表
在 { } 符号中指定作为值列表的属性值。作为列表的 classpath 属性的表示形式如清单 3 所示。将空列表指定为 {}。
清单 3.列表的 classpath 属性表示形式
# # SubSection 1.0 # JDBCProvider attributes # ResourceType=JDBCProvider ImplementingResourceType=JDBCProvider ResourceId=Cell=myCell:JDBCProvider=ID#builtin_jdbcprovider # # #Properties # classpath={${DERBY_JDBC_DRIVER_PATH}/derby.jar,/my.jar} implementationClassName=org.apache.derby.jdbc.EmbeddedXADataSource name=Derby JDBC Provider (XA) nativepath={} description=Built-in Derby JDBC Provider (XA) providerType=Derby JDBC Provider (XA) xa=true #boolean
-
未设置值(空值)
如果在配置中未设置属性的值,则该属性值将表示为空值(清单 4)。
清单 4. 属性为空值的设置
# # SubSection 1.0 # ServerCluster attributes # ResourceType=ServerCluster ImplementingResourceType=ServerCluster ResourceId=Cell=myCell:Cluster=MMc1 # # #Properties # name=MMc1 preferLocal=true #boolean nodeGroupName=null stateManagement=null enableHA=false #boolean uniqueId=null serverType=APPLICATION_SERVER #ENUM shortName=null description=null statisticsProvider=null
-
属性的类型
属性的类型(int、long、float 等)的表示形式如清单 5 所示。如果未提及类型,则其缺省值为字符串。
清单 5. 属性的类型的表示形式
# # SubSection 1.0.2.0.2 # Monitoring Policy Section # ResourceType=MonitoringPolicy ImplementingResourceType=Server ResourceId=Cell=myCell:Node=myNode:Server=server1: MonitoringPolicy=ID#MonitoringPolicy_1 AttributeInfo=monitoringPolicy # # #Properties # maximumStartupAttempts=3 #integer pingTimeout=300 #integer pingInterval=60 #integer autoRestart=true #boolean nodeRestartState=STOPPED #ENUM
-
创建新对象所需的属性
如果给定的对象需要属性,则其表示形式如清单 6 所示。此属性应存在于创建新对象所使用的属性文件中。
清单 6. 为给定的对象设置属性
# # Create parameters # These parameters should be set to create a new instance of the following type # of object. # Replace the line `CreateTemplate=true` with 'CreateDeleteCommandProperties=true' # and set actual values for the following properties to create a new object. # ResourceType=Server ImplementingResourceType=Server ResourceId=Server= CreateTemplate=true # # #Properties # name=name #String,required templateLocation=null #javax.management.ObjectName genUniquePorts=null #Boolean commandName=createApplicationServer specificShortName=null #String clusterName=null #String targetObject=targetObject #ObjectName,required templateName=null #String genericShortName=null #String
-
Readonly 属性
Readonly 属性是不能更改的。在清单 7 中,taskName、mutables 和 row0 属性都是不可改变的。所有其他属性(行)都可以修改。
清单 7. Readonly 属性
# # SubSection 1.1 # MapModulesToServers Section. taskName,mutables and row0 should # not be edited. # ResourceType=Application ImplementingResourceType=Application ResourceId=Cell=myCell:Application=ivtApp # # #Properties # taskName=MapModulesToServers #readonly mutables={false false true false false false} #readonly row0={module uri server ModuleVersion moduletype moduletypeDisplay} #readonly row2={"IVT Application" ivt_app.war,WEB-INF/web.xml WebSphere:cell=myCell: node=myNode,server=server1 12 moduletype.web "Web Module"} row1={"IVT EJB Module" ivtEJB.jar,META-INF/ejb-jar.xml WebSphere:cell=myCell, node=myNode,server=server1 12 moduletype.ejb "EJB Module"}
-
指向另一个对象的属性值引用
如果属性值包含指向另一个对象的引用,则将该对象的显示名称设置为它的值(清单 8)。如果被引用的对象没有显示名称,则将完整的 configId 设置为其值。
清单 8. 对象之间属性值的引用
# # SubSection 1.0.1.2 # TCP Inbound Transport Channels # ResourceType=TCPInboundChannel ImplementingResourceType=Server ResourceId=Cell=myCell:Node=myNode:Server=serve r1:TCPInboundChannel=ID#TCPInboundChannel_1 # # #Properties # maxOpenConnections=20000 #integer name=TCP_3 hostNameIncludeList={} hostNameExcludeList={} endPointName=WC_adminhost_secure inactivityTimeout=60 #integer discriminationWeight=0 #integer ddressIncludeList={} addressExcludeList={} threadPool=WebContainer #ObjectName(ThreadPool)
-
包含空格或其他特殊字符的属性值
包含空格或其他特殊字符的属性值用“ ”括起来(清单 9)。
清单 9. 空格或其他特殊字符的属性值设置
# # SubSection 1.1 # TimerManagerInfo section # ResourceType=TimerManagerInfo ImplementingResourceType=TimerManagerProvider ResourceId=Cell=myCell:Cluster=MMc1:TimerManagerInfo=ID#TimerMana gerInfo_Default # # #Properties # name=DefaultTimerManager referenceable=null category=null defTranClass=null providerType=null numAlarmThreads=2 #integer jndiName="tm/default" serviceNames={} provider=TimerManagerProvider #ObjectName(TimerManagerProvider) description=WebSphere Default TimerManager
-
特殊属性
可以将下面的特殊属性添加到属性文件,以指示在将属性文件应用到配置时是跳过还是处理给定的部分:
- SKIP
可以将每个部分的 SKIP 属性设置为 true 或 false。此属性只能由 applyConfigProperties 和 deleteConfigProperties 命令使用。缺省值为 false。当此属性在某一部分中存在并设置为 true 时,则跳过该部分。
当使用 applyConfigProperties 命令处理某一部分时,如果与该部分对应的配置对象丢失,则系统会自动创建它。当使用 deleteConfigProperties 命令处理某一部分时,如果与该部分对应的配置数据丢失,则系统不会采取任何操作。
示例:SKIP=true
- SKIPSUBSECTIONS
当此属性在某一部分中存在并设置为 true 时,将跳过所有子部分。缺省值为 false。通过遍历该部分(包含此变量参数)中包含的所有部分来确定子部分。
示例:SKIPSUBSECTIONS=true
- DELETE
当此属性在某一部分中存在设置为 true 时,该部分将从配置中完全删除。与该部分对应的配置对象也将被删除。
示例:DELETE=true
现在您已大致了解了属性文件的用途以及使用方式,下面是一些具体示例,这些示例将演示如何使用基于属性文件的配置实用工具:
可以使用 ExtractConfigProperties 命令以属性的形式从系统中提取配置数据。使用此命令可以提取整个计算单元的配置或仅提取配置的一部分。
- 示例 1:提取整个计算单元配置
使用以下命令可提取整个计算单元的配置。提取的文件类似于清单 10。
wsadmin> AdminTask.extractConfigProperties('[-propertiesFileName cell.props ]')
清单 10. 使用命令提取整个计算单元的配置
# Cell.props # # SubSection 1.0 # Cell level attributes # ResourceType=Cell ImplementingResourceType=Cell ResourceId=Cell=!{cellName} # # #Properties # shortName=null cellType=DISTRIBUTED #ENUM(UDP|TCP|MULTICAST|DISTRIBUTED|STANDALONE),readonly name=!{cellName} multicastDiscoveryAddressEndpointName=null discoveryAddressEndpointName=null cellDiscoveryProtocol=TCP #ENUM(UDP|TCP|MULTICAST) ... ... Properties of nodes,servers, clusters, applications, etc. ... EnvironmentVariablesSection # # #Environment Variables #Thu Apr 17 05:38:01 CDT 2008 cellName=MyCell
请注意 !{cellName} 变量。属性文件不会有实际的 cellName、nodeName、serverName、clusterName、applicationName、coreGroup 或 nodeGroup 值。而是将这些值表示为变量。文件底部的 EnvironmentVariables 部分包含属性文件中使用的所有变量。
- 示例 2:提取服务器配置
使用下面的命令可提取服务器配置。提取的文件类似于清单 11。
wsadmin> AdminTask.extractConfigProperties('[-propertiesFileName server.props -configData Server=dmgr ]')
清单 11. 使用命令提取服务器配置
# # SubSection 1.0 # Server Section # ResourceType=Server ImplementingResourceType=Server ResourceId=Cell=!{cellName}:Node=!{nodeName}:Server=!{serverName} # # #Properties # shortName=null serverType=DEPLOYMENT_MANAGER #readonly developmentMode=false #boolean parallelStartEnabled=true #boolean name=!{serverName} clusterName=null uniqueId=null modelId=null … … Properties of other inner objects ( EJBContainer, WebContainer, ORB etc) … and subtypes not shown. … EnvironmentVariablesSection # #Environment Variables # cellName=MyCell nodeName=MyNodeManager hostName=MyHost serverName=dmgr
- 示例 3:提取服务器的 EJBContainer 和 WebContainer 属性
可以使用下面的命令仅提取服务器的 EJBContainer 属性:
wsadmin> AdminTask.extractConfigProperties('[-propertiesFileName ejbcontainer.props -configData Server=dmgr -filterMechanism SELECTED_SUBTYPES -selectedSubTypes [EJBContainer ] ]')
可以使用下面的命令提取 EJBContainer 和 WebContainer 属性:
wsadmin> AdminTask.extractConfigProperties('[-propertiesFileName container.props -filterMechanism SELECTED_SUBTYPES –selectedSubTypes [EJBContainer WebContainer ] ]')
提取的属性文件将仅包含 EJBContainer 和 WebContainer 的属性,如清单 12 所示。
清单 12. 提取相关属性文件中的属性
# # SubSection 1.0 # EJBContainer # ResourceType=EJBContainer ImplementingResourceType=EJBContainer ResourceId=Cell=!{cellName}:Node=!{nodeName}:Server=!{serverName}: ApplicationServer=ID#ApplicationServer_1:EJBContainer=ID#EJBContainer_1 AttributeInfo=components # # #Properties # EJBTimer={} #ObjectName*(null) name=null defaultDatasourceJNDIName=null inactivePoolCleanupInterval=30000 #long passivationDirectory="${USER_INSTALL_ROOT}/temp" enableSFSBFailover=false #boolean server=null parentComponent=Network Deployment Server # # SubSection 1.0 # WebContainer # ResourceType=WebContainer ImplementingResourceType=WebContainer ResourceId=Cell=!{cellName}:Node=!{nodeName}:Server=!{serverName}: ApplicationServer=ID#ApplicationServer_1:WebContainer=ID#WebContainer_1 AttributeInfo=components # # #Properties # enableServletCaching=false #boolean name=null defaultVirtualHostName=null server=null maximumPercentageExpiredEntries=15 #integer asyncIncludeTimeout=60000 #integer parentComponent=Network Deployment Server disablePooling=false #boolean sessionAffinityFailoverServer=null maximumResponseStoreSize=100 #integer allowAsyncRequestDispatching=false #boolean sessionAffinityTimeout=0 #integer EnvironmentVariablesSection # #Environment Variables # cellName=MyCell nodeName=MyCellManager hostName=MyHost serverName=dmgr
请注意 ResourceId 行中的 EJBContainer=ID#EJBContainer_1 语句。它唯一地表示服务器中的 EJBContainer 对象。由于此案例中的名称字段为空,因此您必须使用 xmi ID 才能表示此对象。而且,xmi ID 是在配置中唯一地标识对象的唯一方法,因为在大多数情况下可以使用同一名称创建多个对象。不过,将属性文件应用到配置之前,如果配置中的名称字段被设置为 myContainer,则可以将此字段修改为 EJBContainer=myContainer。
- 示例 4:提取节点属性,而无需遍历节点的内容(子类型)
下面的命令可以提取节点的属性,而无需提取其子类型的属性(如服务器和资源)。产生的属性文件将类似于清单 13,其中没有任何子类型信息。
wsadmin> AdminTask.extractConfigProperties('[-propertiesFileName node.props -configData Node=MyCellManager -filterMechanism NO_SUBTYPES]')
清单 13. 提取节点属性
# # SubSection 1.0 # Node Section # ResourceType=Node ImplementingResourceType=Node ResourceId=Cell=!{cellName}:Node=!{nodeName} # # #Properties # shortName=null name=!{nodeName} maxFilePermissionForApps=".*\.dll=755#.*\.so=755#.*\.a=755#.*\.sl=755 " discoveryProtocol=TCP #ENUM(UDP|TCP|MULTICAST) hostName=!{hostName} # ## Section 1.0_1#Cell=!{cellName}:Node=!{nodeName} # ResourceType=Node ImplementingResourceType=Node ExtensionId=NodeMetadataExtension ResourceId=Cell=!{cellName}:Node=!{nodeName} # nodeOS=distributed nodeVersion=7.0.0.0 # # End of Section 1.0# Cell=!{cellName}:Node=!{nodeName} # EnvironmentVariablesSection # #Environment Variables #Thu Apr 17 14:27:01 CDT 2008 cellName=MyCell nodeName=MyCellManager
- 示例 5:提取节点属性,而无需遍历该节点的内容(子类型)和调用任何扩展
可以使用下面的命令提取节点属性,而无需包括扩展的属性。清单 14 是执行此命令的结果。请注意,NodeMetadataExtension 部分不见了,因为该部分是对节点资源的扩展。
wsadmin> AdminTask.extractConfigProperties('[-propertiesFileName node.props -configData Node=MyCellManager -filterMechanism NO_SUBTYPES_AND_EXTENSIONS]')
清单 14. 执行提取节点属性命令的结果
# # SubSection 1.0 # Node Section # ResourceType=Node ImplementingResourceType=Node ResourceId=Cell=!{cellName}:Node=!{nodeName} # # #Properties # shortName=null name=!{nodeName} maxFilePermissionForApps=".*\.dll=755#.*\.so=755#.*\.a=755#.*\.sl=755 " discoveryProtocol=TCP #ENUM(UDP|TCP|MULTICAST) hostName=!{hostName} # # End of Section 1.0_1# Cell=!{cellName}:Node=!{nodeName} # EnvironmentVariablesSection # #Environment Variables # cellName=MyCell nodeName=MyCellManager
提取配置文件后,可以使用任何文本编辑器修改一个或多个属性值,然后使用 applyConfigProperties 命令将其应用回该配置。
- 示例 1:修改一个或多个属性,并将属性文件应用到配置
在本例中,将属性文件中的 EJBContainer 的 enableSFSBFailover 属性从 false 更改为 true。
清单 15. 修改相关属性
# # File : ejbcontainer.props # # SubSection 1.0 # EJBContainer # ResourceType=EJBContainer ImplementingResourceType=EJBContainer ResourceId=Cell=!{cellName}:Node=!{nodeName}:Server=!{serverName}: ApplicationServer=ID#ApplicationServer_1:EJBContainer=ID#EJBContainer_1 AttributeInfo=components # # #Properties # EJBTimer={} #ObjectName*(null) name=null defaultDatasourceJNDIName=null inactivePoolCleanupInterval=30000 #long passivationDirectory="${USER_INSTALL_ROOT}/temp" enableSFSBFailover=true #boolean server=null parentComponent=Network Deployment Server EnvironmentVariablesSection # #Environment Variables # hostName2=* hostName1=localhost cellName=MyCell nodeName=MyCellManager hostName=MyHost serverName=dmgr enableSSB=true
修改属性文件后,可以运行此命令以将属性应用到系统。然后可以再次提取属性来验证这些更改。
wsadmin> AdminTask.applyConfigProperties('[-propertiesFileName ejbcontainer.props ]')
- 示例 2:使用其他用户定义的变量
在本例中,通过使用变量 !{enableSSB} 的值来修改同一属性 (enableSFSBFailover)。在部分标题中或该部分的属性区域中可以使用该变量。另外,属性值可以由多个变量组成,如 ResourceId 所示。在清单 16 中,应修改 EnvironmentVariableSection 以包括使用的任何新变量。
清单 16. 使用其他用户定义的变量
# # File : ejbcontainer.props # # SubSection 1.0 # EJBContainer # ResourceType=EJBContainer ImplementingResourceType=EJBContainer ResourceId=Cell=!{cellName}:Node=!{nodeName}:Server=!{serverName}: ApplicationServer=ID#ApplicationServer_1:EJBContainer=ID#EJBContainer_1 AttributeInfo=components # # #Properties # EJBTimer={} #ObjectName*(null) name=null defaultDatasourceJNDIName=null inactivePoolCleanupInterval=30000 #long passivationDirectory="${USER_INSTALL_ROOT}/temp" enableSFSBFailover=!{enableSSB} #boolean server=null parentComponent=Network Deployment Server EnvironmentVariablesSection # # #Environment Variables # hostName2=* hostName1=localhost ellName=MyCell nodeName=MyCellManager hostName=MyHost serverName=dmgr enableSSB=true
更改属性文件后,可以使用同一命令应用属性文件。
wsadmin> AdminTask.applyConfigProperties('[-propertiesFileName ejbcontainer.props ]')
- 示例 3:使用其他 variableMap 文件,而不是属性文件中的该文件
在本例(清单 17)中,所有变量都被放入不同的文件中(清单 18)。
清单 17. 使用其他 variableMap 文件
# File : ejbcontainer.props # # SubSection 1.0 # EJBContainer # ResourceType=EJBContainer ImplementingResourceType=EJBContainer ResourceId=Cell=!{cellName}:Node=!{nodeName}:Server=!{serverName}: ApplicationServer=ID#ApplicationServer_1:EJBContainer=ID#EJBContainer_1 AttributeInfo=components # # #Properties # EJBTimer={} #ObjectName*(null) name=null defaultDatasourceJNDIName=null inactivePoolCleanupInterval=30000 #long passivationDirectory="${USER_INSTALL_ROOT}/temp" enableSFSBFailover=!{enableSSB} #boolean server=null parentComponent=Network Deployment Server
清单 18. 所有变量都被放入不同的文件中
#File : ejbprops.vars: # # #Environment Variables # hostName2=* hostName1=localhost cellName=MyCell nodeName=MyCellManager hostName=MyHost serverName=dmgr enableSSB=true
现在可以使用此命令应用使用其他变量映射文件的属性文件:
wsadmin>AdminTask.applyConfigProperties('[-propertiesFileName ejbcontainer.props -variablesMapFileName ejbprops.vars ]')
将文件应用到配置之前,应验证使用文本编辑器修改的属性文件。为此操作提供了单独的命令。不过,applyConfigProperties 命令将属性应用到配置之前,还以缺省方式执行验证。如果已验证属性文件,那么通过在 applyConfigProperties 命令中选择一个选项可以禁用在应用过程中进行的验证。
- 示例 1:验证属性文件
在缺省情况下,应用属性文件时,应对整个属性文件执行验证。不过,您可以使用下面的命令单独验证属性文件。该命令将生成类似于清单 19 的报告文件。
wsadmin> AdminTask.validateConfigProperties('[-propertiesFileName ejbcontainer.props -variablesMapFileName ejbprops.vars -reportFileName report.txt ]')
清单 19. 报告文件
ADMG0820I: Start applying properties from file ejbcontainer.props ADMG0818I: Processing section EJBContainer:ApplicationServer. ADMG0810I: Not changing value for this property EJBTimer. New value specified is same as current value {}. ADMG0810I: Not changing value for this property defaultDatasourceJNDIName. New value specified is same as current value null. ADMG0811I: Changing value for this property enableSFSBFailover. New value specified is true. Old value was false. ADMG0810I: Not changing value for this property inactivePoolCleanupInterval. New value specified is same as current value 30000. ADMG0810I: Not changing value for this property name. New value specified is same as current value null. ADMG0807I: Property parentComponent is readonly. Will not be modified ADMG0810I: Not changing value for this property passivationDirectory. New value specified is same as current value ${USER_INSTALL_ROOT}/temp. ADMG0807I: Property server is readonly. Will not be modified ADMG0819I: End Processing section EJBContainer:ApplicationServer.
清单 19 中显示的报告文件非常详细。该文件报告了以下内容:
- 对属性值的任何更改(配置中的值与属性文件中的值不同)。
- 未更改的属性值(配置中的值与属性文件中的值相同)。
- 无法更改的只读类型的属性。
- 其他错误。
要使生成的报告文件变得更简洁,可以指定 reportFilterMechanism 参数来报告:
- 仅报告错误
- 错误和对配置的任何更改
- 全部。
例如,可以使用下面的命令仅报告错误和更改。生成的报告文件仅包含清单 20 中所示的信息(本案例中有一条错误和一个配置更改)。
wsadmin> AdminTask.validateConfigProperties('[-propertiesFileName ejbcontainer.props -variablesMapFileName ejbprops.vars -reportFileName report.txt -reportFilterMechanism Errors_And_Changes ]')
清单 20. 生成的错误报告和配置更改信息
ADMG0820I: Start applying properties from file ejbcontainer.props ADMG0811I: Changing value for this property enableSFSBFailover. New value specified is true. Old value was false. ADMG0831I: Value specified for property inactivePoolCleanupInterval is not a valid type. Specified value asdf, Required type long. ADMG0821I: End applying properties from file ejbcontainer.props.
清单 20 包含一条有关对配置进行更改的消息,以及另一条有关为属性指定了无效值的消息。它包含一个配置更改和一条错误。
- 示例 2:在应用过程中验证属性文件
在缺省情况下,应用属性文件时,将对整个属性文件执行验证。如果属性文件中存在任何问题,则对配置不进行任何更改。如果属性文件中没有任何问题,则按计划应用属性文件。如果在应用之前已验证属性文件,则可以将验证参数设置为 false,如下所示:
wsadmin> AdminTask.applyConfigProperties('[-propertiesFileName ejbcontainer.props -variablesMapFileName ejbprops.vars -validate false]')
- 示例 3:在应用过程中生成报告
通过指定报告文件名参数可以将应用属性文件时造成的所有配置更改都记录在报告文件中,如下所示。生成的报告文件类似于清单 21。
wsadmin> AdminTask.applyConfigProperties('[-propertiesFileName ejbcontainer.props -variablesMapFileName ejbprops.vars –reportFileName report.txt ]')
清单 21. 在应用过程中生成报告
ADMG0820I: Start applying properties from file ejbcontainer.props ADMG0818I: Processing section EJBContainer:ApplicationServer. ADMG0810I: Not changing value for this property EJBTimer. New value specified is same as current value {}. ADMG0810I: Not changing value for this property defaultDatasourceJNDIName. New value specified is same as current value null. ADMG0811I: Changing value for this property enableSFSBFailover. New value specified is true. Old value was false. ADMG0810I: Not changing value for this property inactivePoolCleanupInterval. New value specified is same as current value 30000. ADMG0810I: Not changing value for this property name. New value specified is same as current value null. ADMG0807I: Property parentComponent is readonly. Will not be modified ADMG0810I: Not changing value for this property passivationDirectory. New value specified is same as current value ${USER_INSTALL_ROOT}/temp. ADMG0807I: Property server is readonly. Will not be modified ADMG0819I: End Processing section EJBContainer:ApplicationServer.
与清单 19 一样,清单 21 中显示的报告文件也非常详细。您可以指定 reportFilterMechanism 参数,使生成的报告更简洁。例如,您可以使用此命令仅报告错误和更改,生成的报告将类似于清单 22。
wsadmin>AdminTask.applyConfigProperties('[-propertiesFileName ejbcontainer.props -variablesMapFileName ejbprops.vars –reportFileName report.txt -reportFilterMechanism Errors_And_Changes ]')
清单 22. 生成的错误和更改报告
ADMG0820I: Start applying properties from file ejbcontainer.props ADMG0811I: Changing value for this property enableSFSBFailover. New value specified is true. Old value was false. ADMG0831I: Value specified for property inactivePoolCleanupInterval is not a valid type. Specified value asdf, Required type long. ADMG0821I: End applying properties from file ejbcontainer.props.
清单 22 包含一条有关对配置进行更改的消息,以及另一条有关为属性指定了无效值的消息。它包含一个配置更改和一条错误。
要创建服务器、集群、应用程序和 authorizationgroup 等类型的对象,应首先使用 createPropertiesFileTemplates 命令创建属性文件模板。您应修改此模板属性文件(如生成文件的注释部分中描述的),然后使用 applyConfigProperties 命令创建新对象。例如,您可以按照以下三个步骤创建新的 AuthorizationGroup:
- 生成属性文件模板
请使用下面的命令创建稍后用来创建新对象的属性文件模板。此命令将创建清单 23 所示的模板文件。
wsadmin>AdminTask.createPropertiesFileTemplates('[-propertiesFileName ag.template -configType AuthorizationGroup ]')
清单 23. 生成属性文件模板
# # Create parameters # Replace the line `SKIP=true` with 'SKIP=false' under each section that is needed # Set necessary parameters under each command or step sections # Invoke applyConfigProperties command using this properties file. # ResourceType=AuthorizationGroup ImplementingResourceType=AuthorizationGroup ResourceId=AuthorizationGroup= SKIP=true CreateDeleteCommandProperties=true # # #Properties # authorizationGroupName=authorizationGroupName #String,required commandName=createAuthorizationGroup
- 修改生成的模板文件
通过设置所需的参数(至少)并将 SKIP=true 更改为 SKIP=false 来修改生成的文件(清单 23)。修改的文件应该类似于清单 24。
清单 24. 修改生成的模板文件
# # Create parameters # Replace the line `SKIP=true` with 'SKIP=false' under each section that is needed # Set necessary parameters under each command or step sections # Invoke applyConfigProperties command using this properties file. # ResourceType=AuthorizationGroup ImplementingResourceType=AuthorizationGroup ResourceId=AuthorizationGroup= SKIP=false CreateDeleteCommandProperties=true # # #Properties # authorizationGroupName=ag1 #String,required commandName=createAuthorizationGroup
- 使用修改的模板文件应用配置
使用 applyConfigProperties 命令创建新的权限组对象。这将创建新的权限组 (ag1)。
AdminTask.applyConfigProperties('[-propertiesFileName ag.template ]')
要删除服务器、集群、应用程序或 authorizationgroup 等类型的对象,应首先使用 createPropertiesFileTemplates 命令创建属性文件模板。修改此模板属性文件(如生成文件的注释部分中描述),然后使用 deleteConfigProperties 命令删除现有对象。例如,要删除现有 AuthorizationGroup,请执行以下操作:
- 生成属性文件模板
请使用下面的命令创建属性文件模板,以供稍后创建新对象使用。此命令将创建清单 25 所示的模板文件。
wsadmin>AdminTask.createPropertiesFileTemplates('[-propertiesFileName ag.template -configType AuthorizationGroup ]')
清单 25. 生成属性文件模板
# # Delete parameters # Replace the line `SKIP=true` with 'SKIP=false' under each section that is needed # Set necessary parameters under each command or step sections # Invoke deleteConfigProperties command using this properties file. # ResourceType=AuthorizationGroup ImplementingResourceType=AuthorizationGroup ResourceId=AuthorizationGroup= SKIP=true CreateDeleteCommandProperties=true # # #Properties # authorizationGroupName=authorizationGroupName #String,required commandName=deleteAuthorizationGroup
- 修改生成的模板文件
通过设置所需的参数(至少)并将 SKIP=true 更改为 SKIP=false 来修改生成的文件。修改的文件应该类似于清单 26。
清单 26. 修改生成的模板文件
# # Delete parameters # Replace the line `SKIP=true` with 'SKIP=false' under each section that is needed # Set necessary parameters under each command or step sections # Invoke deleteConfigProperties command using this properties file. # ResourceType=AuthorizationGroup ImplementingResourceType=AuthorizationGroup ResourceId=AuthorizationGroup= SKIP=false CreateDeleteCommandProperties=true # # #Properties # authorizationGroupName=ag1 #String,required commandName=deleteAuthorizationGroup
- 使用修改的模板文件删除配置
请使用 deleteConfigProperties 命令删除现有权限组对象。此命令将删除权限组 (ag1):
AdminTask.deleteConfigProperties('[-propertiesFileName ag.template ]')
如前所述,要创建服务器、集群、应用程序或权限组类型的对象,请使用模板属性文件。不过,通过修改提取的属性文件和 ResourceId 字段可以创建其他大多数类型的对象,这样,配置中不会存在该 ResourceId 表示的资源。当使用包含非现有资源 ID 的属性文件调用 applyConfigProperties 命令时,该命令将尝试创建新的对象。
- 示例 1:使用属性文件创建新的 ThreadPool(使用不在配置中的 ID)
假设清单 27 是提取的属性文件中的一部分。在这里,配置中已存在该对象。
清单 27. 使用属性文件创建新的 ThreadPool
# # SubSection 1.0.1.4 # Thread pools # ResourceType=ThreadPool ImplementingResourceType=Server ResourceId=Cell=!{cellName}:Node=!{nodeName}:Server=!{serverName}:Thr eadPoolManager=ID#ThreadPoolManager_1:ThreadPool=ID#builtin_ThreadPool_4 # # #Properties # maximumSize=20 #integer name=Default inactivityTimeout=5000 #integer minimumSize=5 #integer isGrowable=false #boolean
您可以修改 ResourceId,这样该 ResourceId 表示的线程池不会存在。在清单 28 中,配置中不存在此线程池 ThreadPool_9999 ID。
清单 28. 修改 ResourceId
# # SubSection 1.0.1.4 # Thread pools # ResourceType=ThreadPool ImplementingResourceType=Server ResourceId=Cell=!{cellName}:Node=!{nodeName}:Server=!{serverName}:Thr eadPoolManager=ID#ThreadPoolManager_1:ThreadPool=ThreadPool_99999 # # #Properties # maximumSize=20 #integer name=myThreadPool inactivityTimeout=5000 #integer minimumSize=5 #integer isGrowable=false #boolean
现在,如果使用此属性文件调用 applyConfigProperties 命令,则会创建新的 ThreadPool:
wsadmin> AdminTask.applyConfigProperties('[-propertiesFileName thp.props ]')
- 示例 2:使用属性文件创建新的 ThreadPool(使用不在配置中的线程池名称)
与使用配置中没有的随机 ID 不同,如果该对象具有名称属性,并且指定的名称还未存在于配置中,则还可以指定对象的名称。清单 29 显示了使用名称而非 ID 的属性文件。
清单 29. 显示了使用名称而非 ID 的属性文件
# # SubSection 1.0.1.4 # Thread pools # ResourceType=ThreadPool ImplementingResourceType=Server ResourceId=Cell=!{cellName}:Node=!{nodeName}:Server=!{serverName}:Thr eadPoolManager=ID#ThreadPoolManager_1:ThreadPool=myThreadPool # # #Properties # maximumSize=20 #integer name=myThreadPool inactivityTimeout=5000 #integer minimumSize=5 #integer isGrowable=false #boolean
使用此属性文件调用 applyConfigProperties 命令时,该命令将创建新的线程池:
wsadmin> AdminTask.applyConfigProperties('[-propertiesFileName thp.props ]')
- 示例 3:使用 deleteConfigProperties 命令删除现有对象
要删除对象,请使用 deleteConfigProperties 命令。例如,要删除刚才在示例 2 中创建的线程池,您可以使用创建命令所使用的同一属性文件来运行该命令,但是在标题中使用 DELETE=true,如清单 30 所示。
清单 30. 使用 deleteConfigProperties 命令删除现有对象
# # SubSection 1.0.1.4 # Thread pools # ResourceType=ThreadPool ImplementingResourceType=Server ResourceId=Cell=!{cellName}:Node=!{nodeName}:Server=!{serverName}:Thr eadPoolManager=ID#ThreadPoolManager_1:ThreadPool=myThreadPool DELETE=true # # #Properties # maximumSize=20 #integer name=myThreadPool inactivityTimeout=5000 #integer minimumSize=5 #integer isGrowable=false #boolean
或者,不使用 ThreadPool=myThreadPool,而改为使用 ThreadPool=ID#ThreadPool_12345。您必须确保输入的 ID(这里为“ThreadPool_12345”)是此对象的配置中的实际 ID。
将 deleteConfigProperties 命令与上述属性文件一起使用来删除该对象。它将从配置中删除属性文件表示的线程池:
wsadmin> AdminTask.deleteConfigProperties('[-propertiesFileName thp.props ]')
请注意,如果未指定 DELETE,则 deleteConfigProperties 命令将尝试删除每个属性,并将对象保留在配置中。从对象移除每个属性时,属性将重设为缺省值(如果存在缺省值)或者被移除。
下面是您可以使用基于属性文件的配置执行的其他功能的一些示例:
- 使用属性文件安装应用程序
使用 applyConfigProperties 命令应用清单 31 中的属性文件时,将安装属性文件中指定的应用程序。
清单 31. 使用属性文件安装应用程序
# Header ResourceType=Application ImplementingResourceType=Application ResourceId=Deployment= # Properties Name=hello TargetServer=server1 TargetNode=node1 EarFileLocation=/temp/Hello.ear #TargetCluster=cluster1
- 使用属性文件卸载应用程序
使用 deleteConfigProperties 命令应用清单 32 中的属性文件时,将卸载属性文件中指定的应用程序。
清单 32. 使用 deleteConfigProperties 命令 卸载属性文件中指定的应用程序
# Header ResourceType=Application ImplementingResourceType=Application ResourceId=Deployment=hello # Properties Name=hello
- 使用属性文件更新应用程序
要更新已安装的应用程序,您可以使用 applyConfigProperties 命令通过属性文件执行各种更新。要添加单个文件,请使用属性文件(如清单 33 所示的属性文件)调用 applyConfigProperties 命令。
清单 33. 使用属性文件更新应用程序
# Header ResourceType=Application ImplementingResourceType=Application ResourceId=Deployment=hello # Properties Name=hello Update=true perationType=add contentType=file contentURI=test.war/com/ibm/addMe.jsp contentFile=c:/temp/addMe.jsp
要删除单个文件,请使用属性文件(如清单 34 所示的属性文件)调用 applyConfigProperties 命令。
清单 34. 删除单个文件
# Header ResourceType=Application ImplementingResourceType=Application ResourceId=Deployment=hello # Properties Name=hello Update=true perationType=delete contentType=file contentURI=test.war/com/ibm/addMe.jsp
要添加模块,请使用属性文件(如清单 35 所示的属性文件)调用 applyConfigProperties 命令。
清单 35. 添加模块
# Header ResourceType=Application ImplementingResourceType=Application ResourceId=Deployment=hello # Properties Name=hello Update=true perationType=add contentType=moduleFile #contextRoot=”/mywebapp” # required for webmodule only contentURI= Increment.jar contentFile= c:/apps/app1/Increment.jar deployEJB=false
要删除模块,请使用属性文件(如清单 36 所示的属性文件)调用 applyConfigProperties 命令。
清单 36. 删除模块
# Header ResourceType=Application ImplementingResourceType=Application ResourceId=Deployment=hello # Properties Name=hello Update=true perationType=delete contentType=moduleFile contentURI= test.war
要执行部分更新,请使用属性文件(如清单 37 所示的属性文件)来调用 applyConfigProperties 命令。
清单 37. 执行部分更新
# Header ResourceType=Application ImplementingResourceType=Application ResourceId=Deployment=hello # Properties Name=hello Update=true perationType=update contentType=partialapp contentFile= c:/temp/MyApp/myAppPartial.zip
要执行完全更新,请使用属性文件(如清单 38 所示的属性文件)调用 applyConfigProperties 命令。
清单 38. 执行完全更新
# Header ResourceType=Application ImplementingResourceType=Application ResourceId=Deployment=hello # Properties Name=hello Update=true perationType=update contentType=app contentFile= c:/apps/app1/newApp1.ear useDefaultBindings=true




回页首
基于属性的配置是监视和管理 IBM WebSphere Application Server V7.0 配置的新的独特方法。它为管理 WebSphere Application Server 环境提供了一种更为方便的方法,因为该配置不需要深入了解复杂的配置模型或重要的编程技能。不过,在更新配置时仍要多加小心,因为应用服务器的行为直接取决于这些配置参数。本文通过一些示例说明了使用基于属性的配置可以进行哪些配置以及如何进行配置。您可以在WebSphere Application Server 信息中心中找到有关此主题和此功能的详细信息。
- 示例 1:提取整个计算单元配置
- SKIP