2014-09-26 45 views
0

當前我正在研究可執行外部jython腳本的jython腳本。執行的(外部)jython腳本必須在腳本運行的同一個weblogic會話中運行,以便能夠取消會話(如果發生錯誤)或激活它。 weblogic連接正在我的腳本中創建,被調用腳本必須使用創建的(帶有'startEdit()')會話。子腳本中的WLST命令

我發現了一個混合解決方案,但也許它可以做的更好。

在工作溶液中執行腳本:

import wlst_operations as wl 
print 'Start' 
wl.cd('/') 
print wl.cmo 
wl.cd('/Servers/AdminServer') 
print wl.cmo 
wl.cd('/JDBCSystemResources/pasDataSource/JDBCResource/pasDataSource/JDBCConnectionPoolPara ms/pasDataSource') 
print wl.cmo 
wl.cmo.setInitialCapacity(6) 

的wlst_operations的Jython從http://www.javamonamour.org/2013/08/wlst-nameerror-cd.html拍攝。 正如你可以看到類似的參考對象(「WL」)必須放在每個WLST命令前... 輸出是罰款:

[MBeanServerInvocationHandler]com.bea:Name=gintdev1,Type=Domain 
[MBeanServerInvocationHandler]com.bea:Name=AdminServer,Type=Server 
[MBeanServerInvocationHandler]com.bea:Name=pasDataSource,Type=weblogic.j2ee.descriptor.wl.JDBCConnectionPoolParamsBean,Parent=[gintdev1]/JDBCSystemResources[pasDataSource],Path=JDBCResource[pasDataSource]/JDBCConnectionPoolParams 

當我不使用對象引用:

from wlstModule import * 
print 'user defined' 
cd('/') 
print cmo 
cd('/Servers/AdminServer') 
print cmo 
cd('/JDBCSystemResources/pasDataSource/JDBCResource/pasDataSource/JDBCConnectionPoolParams/pasDataSource') 
print cmo 
cmo.setInitialCapacity(6) 

然後輸出爲:

[MBeanServerInvocationHandler]com.bea:Name=gintdev1,Type=Domain 
[MBeanServerInvocationHandler]com.bea:Name=gintdev1,Type=Domain 
[MBeanServerInvocationHandler]com.bea:Name=gintdev1,Type=Domain 
Problem invoking WLST - Traceback (innermost last): 
    File "/tmp/lv30083/./orchestrator.py", line 83, in ? 
    File "/tmp/lv30083/./orchestrator.py", line 66, in main 
    File "/tmp/lv30083/./utils/orch_wl.py", line 55, in execute 
    File "user_defined_script_incorrect.py", line 11, in ? 
AttributeError: setInitialCapacity 

即CD命令執行(沒有得到錯誤),但它只是不跳轉到數據源...

我的劇本是

import orch_logging 
import sys 
from wlstModule import * 
class WeblogicManager(object): 
    def connect_to_server(self, p_ssl, p_domainName, p_userConfigFile, p_userKeyFile): 
     logger = orch_logging.Logger() 
     logger.info('Trying to connect to the node manager. domainName='+p_domainName+',userConfigFile='+p_userConfigFile+',ssl='+p_ssl+',p_userKeyFile='+p_userKeyFile) 
     try: 
      connect(domainName=p_domainName,userConfigFile=p_userConfigFile,userKeyFile=p_userKeyFile) 
      return True 
     except: 
      logger.error("Error while trying to connect to node manager!") 
      return False 
    def startEdit(self): 
     edit() 
     startEdit() 
    def activate(self): 
     activate() 
    def undo(self): 
     cancelEdit('y') 
    def disconnect(self): 
     disconnect() 
    def execute(self, path): 
     execfile(path) 

有沒有辦法使用,而無需使用WLST命令「WL」。在他們面前參考?

感謝, 五

回答

0

我不得不修改我的腳本。所有的業務現在有一個上下文(在我的腳本的上下文中)

import sys 
from wlstModule import * 
from weblogic.management.scripting.utils import WLSTUtil 
import sys 

# needed to execute normal (without object reference) WLST commands in child scripts 
origPrompt = sys.ps1 
theInterpreter = WLSTUtil.ensureInterpreter(); 
WLSTUtil.ensureWLCtx(theInterpreter) 
execfile(WLSTUtil.getWLSTScriptPath()) 
execfile(WLSTUtil.getOfflineWLSTScriptPath()) 
exec(WLSTUtil.getOfflineWLSTScriptForModule()) 
execfile(WLSTUtil.getWLSTCommonModulePath()) 
theInterpreter = None 
sys.ps1 = origPrompt 
modules = WLSTUtil.getWLSTModules() 
for mods in modules: 
    execfile(mods.getAbsolutePath()) 
wlstPrompt = "false" 

class WeblogicManager(object): 
    ... 
    def execute(self, path): 
     execfile(path)