使用WSADMIN运行Jython脚本报错:无法创建ObjectName
解决WebSphere Jython脚本重启服务器的错误问题
首先看你遇到的错误 WASX7025E: Error found in String "WebSphere:W"; cannot create ObjectName.,根源是你对AdminControl.queryNames()的返回值处理出错了——这个方法返回的是空格分隔的字符串,不是列表。你直接把它当成列表用ManagedProcessList[i]去取元素,实际上取到的是字符串里的单个字符(比如第一个字符是"W"),后续处理自然会报错无法创建ObjectName。
先看你执行AdminControl.queryNames('WebSphere:type=Server,*')的输出,它是一个完整的字符串:
WebSphere:name=server1,process=server1,platform=proxy,node=WC_node,j2eeType=J2EEServer,version=7.0.0.41,type=Server,mbeanIdentifier=cells/WC_cell/nodes/WC_node/servers/server1/server.xml#Server_1183144161046,cell=WC_cell,spec=1.0,processType=UnManagedProcess
另外原代码还有缩进不规范的问题,Jython对缩进要求严格,这也是潜在的语法隐患。下面是修复后的完整脚本:
# 获取所有Server类型的MBean,将返回的空格分隔字符串分割为列表 managed_process_list = AdminControl.queryNames('WebSphere:type=Server,*').split() for process in managed_process_list: # 获取服务器运行状态 server_status = AdminControl.getAttribute(process, 'state') # 解析服务器名称和节点名称(通过属性前缀筛选,避免依赖固定索引) name_parts = process.split(',') server_name = [part.split('=')[1] for part in name_parts if part.startswith('name=')][0] node_name = [part.split('=')[1] for part in name_parts if part.startswith('node=')][0] if server_status == "STARTED": if node_name == "WC_node" and server_name == "server1": print "restarting", server_name, "on", node_name, "because it is currently", server_status AdminControl.stopServer(server_name, node_name) # 可选:添加等待时间,确保服务器完全停止后再启动 # import time # time.sleep(30) AdminControl.startServer(server_name, node_name) else: print "Not restarting", server_name, "on", node_name, "because it is currently", server_status else: print "Not restarting", server_name, "on", node_name, "because it is currently", server_status
关键修改说明:
- 用
.split()将queryNames的返回值转换为真正的服务器MBean列表,确保每个元素是完整的ObjectName字符串 - 改用属性前缀筛选的方式解析服务器名和节点名,避免原代码依赖固定索引的脆弱性(如果MBean属性顺序变化会直接出错)
- 修正了代码缩进,符合Jython的语法要求
- 增加了可选的等待停止代码,避免服务器未完全停止就启动导致的异常
现在再执行脚本应该就能正常识别服务器并执行重启操作了。
内容的提问来源于stack exchange,提问作者Rajasekhar
相关产品推荐
相关产品推荐

