【问题标题】:<BEA-050001> WLContext.close() was called in a different thread than the one in which it was created<BEA-050001> WLContext.close() 在与创建它的线程不同的线程中调用
【发布时间】:2014-02-20 06:06:34
【问题描述】:

我已经编写了 wlst 脚本来递归地完成以下任务

  • 停止应用程序
  • 取消部署应用程序
  • 部署应用程序

当我执行脚本时,取消部署或部署仅针对 1 个应用程序发生。对于其他应用程序,它会失败并显示以下错误消息。您能帮我解决这个问题吗?

File "<iostream>", line 1116, in domainConfig
  File "<iostream>", line 1848, in raiseWLSTException
WLSTException: Error cding to the MBean
<Feb 20, 2014 11:28:44 AM IST> <Warning> <JNDI> <BEA-050001> <WLContext.close() was called in a different thread than the one in which it was created.>

WLST 编写我写的脚本

import sys
import os
import getopt
#========================
#Usage Section
#========================
def usage():
    print "Usage:"
    print "java weblogic.WLST manageApplication.py -u username -p password -a adminUrl [<hostname>:<port>] -t deploymentTarget\n"
    print "java weblogic.WLST manageApplication.py -u weblogic -p weblogic1 -a t3://localhost:7001 -t AdminServer\n"
    sys.exit(2)
#========================
#Connect To Domain
#========================
def connectToDomain():
    try:
        connect('weblogic','weblogic1','t3://localhost:7001')
        print 'Successfully connected to the domain\n'
    except:
        print 'The domain is unreacheable. Please try again\n'
        exit()
#========================
#Application undeployment Section
#========================

def undeployApplication():
    cd ('AppDeployments')
    myapps=cmo.getAppDeployments()
    for appName in myapps:
        domainConfig()
        cd ('/AppDeployments/'+appName.getName()+'/Targets')
        mytargets = ls(returnMap='true')
        domainRuntime()
        cd('AppRuntimeStateRuntime')
        cd('AppRuntimeStateRuntime')
        for targetinst in mytargets:
            curstate4=cmo.getCurrentState(appName.getName(),targetinst)
            print '-----------', curstate4, '-----------', appName.getName()
            deploymentName=appName.getName()
            deploymentTarget=targetinst
            print deploymentName
            print deploymentTarget
            stopApplication(deploymentName, targets=deploymentTarget)
            undeploy(deploymentName, targets=deploymentTarget)

#========================
#Input Values Validation Section
#========================

if __name__=='__main__' or __name__== 'main':
    try:
        opts, args = getopt.getopt(sys.argv[1:], "u:p:a:t:", ["username=", "password=", "adminUrl=", "deploymentTarget="])
    except getopt.GetoptError, err:
            print str(err)

username = ''
password = ''
adminUrl = ''
deploymentTarget = ''

for opt, arg in opts:
    if opt == "-u":
        username = arg
    elif opt == "-p":
        password = arg
    elif opt == "-a":
        adminUrl = arg
    elif opt == "-t":
        deploymentTarget = arg

if username == "":
    print "Missing \"-u username\" parameter.\n"
    usage()
elif password == "":
    print "Missing \"-p password\" parameter.\n"
    usage()
elif adminUrl == "":
    print "Missing \"-a adminUrl\" parameter.\n"
    usage()
elif deploymentTarget == "":
    print "Missing \"-c deploymentTarget\" parameter.\n"
    usage()
#========================
#Main Control Block For Operations
#========================

def deployMain():
    for line in open("c:\\wlst\\applicationsList.txt"):
        temp_line = line
        fields = temp_line.strip().split(",")
        print(fields[0]+" "+fields[1])
        deploymentName = fields[0]
        deploymentFile = fields[1]
        print deploymentName+" "+deploymentFile+" "+deploymentTarget+"/n"
        deploy(deploymentName,deploymentFile,targets=deploymentTarget)        
#==================
#main block
#=====================    
connectToDomain()
undeployApplication()
deployMain()
disconnect()

【问题讨论】:

  • 你能把整个内容放在 undeployApplication() 方法下的 try except 块下吗?除了块应该有: dumpStack() traceback.print_exc(file=sys.stdout) print sys.exc_info() 这将来自哪个“cd”异常。
  • 你看到这个链接了吗wlstbyexamples.blogspot.in/2010/09/… 你可以处理异常......
  • @Mani - 我在 try except 块中添加了整个 undeployApplication() 脚本。我没有从中得到太多错误信息。第一个应用程序停止并取消部署。对于第二个应用程序,它给出错误 [文件“”,第 1848 行,在 raiseWLSTException WLSTException:错误 cding 到 MBean(,, )

标签: python weblogic wlst


【解决方案1】:

WLContext.close() 可能不是真正的问题(甚至在某些 Oracle 示例中也是如此)。在调用 deploy 和 undeploy 时,您会看到哪些错误消息?

您应该会看到如下内容:

Deploying application from /tmp/something/myapp.ear
Current Status of your Deployment:
Deployment command type: deploy
Deployment State       : completed
Deployment Message     : no message

我还看到您从未在脚本的最后调用activate(),因此如果您在生产模式下运行,这可能是问题。

尝试在脚本最后deployMain() 之后添加以下内容:

save()
status = activate(300000, "block='true'")
status.getStatusByServer()
status.getDetails()

更新:

出现激活错误是因为在取消部署之前没有调用edit():

# Get edit/lock for upcoming changes
edit()
startEdit(120000, 120000, 'false')
undeployApplication()

我认为大大简化您的取消部署会更好。您无需经历确定目标的复杂性,因为您已经从所有目标中取消部署。试试这个,看看你是否能取得进步:

cd ('AppDeployments')
myapps=cmo.getAppDeployments()
for appName in myapps:
   try:
      appPath = "/AppDeployments/" + appName.getName()
      cd(appPath)
      print "Stopping deployment " + appName.getName()
      stopApplication(appName.getName())
      print "Undeploying " + appName.getName()
      undeploy(appName.getName(), timeout=60000)
   except Exception , e:
      print "Deployment " + appName.getName() + " removal failed."

【讨论】:

  • 当我在 deployMain() 方法的末尾添加上述脚本时。我收到以下错误 [WLSTException:执行激活时发生错误:当您不在编辑树中时无法调用编辑函数。] iam 使用 weblogic 11g(wls1033_oepe111150_win32.exe)。
  • 我有 2 个耳朵应用需要部署。如果一个应用程序处于活动状态而另一个处于失败状态,当我尝试取消部署时,我收到错误 [WLST 异常:错误 Cding to Mbean]。取消部署在那里停止并且脚本执行停止。如果我再次运行该脚本第二次,再次取消部署发生第二次。
  • 我的要求是在 weblogic 中的任何状态(活动、失败、准备好、新)中取消部署 2 EAR 应用程序并递归部署 2 EAR。我正在添加要在文本文件中部署的耳朵。请帮助实现同样的目标
  • 更新了答案 - 看看让您的取消部署更简单是否有帮助。
  • @user1041177:在上面的答案中,我认为你必须用 appName.getName() 替换 appName,除非在那个“for”语句中。
猜你喜欢
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多