解析应用程序配置冲突
在具有多个管理用户的共享环境中,不同的管理用户可能会尝试并发更新相同的 WebSphere Application Server 配置文档。以下信息可以帮助您检测并处理多个管理用户尝试并发更新相同的配置文档时可能出现的所有异常。
无论您何时使用管理客户机或 wsadmin 工具登录管理客户机,系统都会创建一个唯一的工作空间会话以跟踪所做的任何配置更改。对于每个工作空间会话,都有一个与其关联的临时工作空间目录。此目录用于存储登录会话期间您更改的所有配置文件。此目录中的文件最初是从单元配置库中解压缩的,并且在进行保存前,您的更改仅存在于这些文件的工作空间副本中。进行保存时,配置管理运行时将确保另一个用户尚未修改并保存您已更改的配置文件,然后将更改后的文件从您的工作空间目录复制回主存储库中。
只要不同的工作空间会话修改不同的配置文件,就不会发生保存冲突。但是,如果多个工作空间会话修改了一个或多个相同的配置文件,那么将发生保存冲突,并且只有最初的工作空间会话更改将反映在单元的配置库中。后续用户尝试保存对相同配置文件的更改时,他们将收到保存冲突异常。
- 将不同的应用程序并发部署到不同的应用程序服务器或不同的应用程序服务器集群。
- 将不同的应用程序并发部署到同一应用程序服务器或同一应用程序服务器集群。
通常,并发或并行应用程序部署方案将安全执行,而系统管理员无需执行任何其他操作。但是,存在 serverindex.xml 合并算法不处理的应用程序部署方案。例如,serverindex.xml 合并算法不会处理将文件更改并发部署到同一应用程序、集群或服务器的方案。合并算法也不会处理其他不仅仅涉及应用程序部署的并发管理活动期间出现的配置冲突。
获取必需的对象引用并构造参数列表
您可以采取一些简单的措施来避免出现配置冲突并解决使用 wsadmin 工具时出现的任何冲突。用于检测和解决配置冲突的 wsadmin 命令依赖于获取对 ConfigService MBean 的引用,然后调用该 MBean 所提供的 getConflictDocuments 方法以确定用户是否已在其工作空间会话期间对文件作出冲突的更改。请参阅 ConfigService MBean 的 Javadoc 以获取有关此 MBean 的更多信息。
以下代码示例说明了如何获取必需的对象引用并构造调用 ConfigService MBean 提供的 getConflictDocuments 方法所必需的参数列表:
// get ConfigService MBean reference
wsadmin>cs = AdminControl.queryNames('WebSphere:*,type=ConfigService')
// obtain ObjectName for ConfigService MBean
wsadmin>import javax.management as mgmt
wsadmin>csName=mgmt.ObjectName(cs)
// get session object for the current administrative user session
wsadmin>session=AdminConfig.getCurrentSession()
// manipulate and prepare the administrative session object and
// MBean operation arguments for use
wsadmin>from com.ibm.websphere.management import Session
wsadmin>from jarray import array
wsadmin>parms=array([session], java.lang.Object)
wsadmin>ptype=array(['com.ibm.websphere.management.Session'], java.lang.String)
// invoke MBean getConflictDocuments method to obtain a list of any document conflicts
wsadmin>AdminControl.invoke_jmx(csName,'getConflictDocuments', parms, ptype)
{}
wsadmin>
Listing 3
wsadmin>AdminControl.invoke_jmx(csName,' getConflictDocuments', parms, ptype)
{['cells/cell_name/nodes/node_name/serverindex.xml',cells/cell_name/applications/
DefaultApplication.ear.ear/deltas/DefaultApplication.ear/delta-1278791909117',
... <list abbreviated> ...}
wsadmin>
wsadmin>AdminConfig.reset()
尽管您在保存更改前调用 getConflictDocuments 方法,并查看是否有冲突的文档,也无法保证保存操作成功,即使您立即发出 AdminConfig.save() 命令也是如此,因为另一个会话可能已在您调用 getConflictDocuments 方法和发出 AdminConfig.save() 命令这两个操作之间修改了相同的配置文件。
如果对主存储库的保存操作不成功,那么您将收到 ConfigServiceException 异常,其内容类似于以下异常:
WASX7015E: Exception running command: "AdminConfig.save()"; exception information:
com.ibm.websphere.management.exception.ConfigServiceException
java.security.PrivilegedActionException:
java.security.PrivilegedActionException:
com.ibm.ws.sm.workspace.WorkSpaceException: RepositoryException
- 使用 getConflictDocuments 方法来确定另一个用户已保存的配置文件。
- 发出 AdminConfig.reset() 命令以废弃您的更改。
- 废弃这些更改后,您可以对相应的配置文件重新应用您的更改,然后发出 AdminConfig.save() 命令以保存这些更改。
随后尝试保存您的更改很可能会成功,因为通常在同一会话期间不会遇到多次保存冲突。但是,如果此保存尝试不成功,请重复上述操作,然后再次保存更改。