使用 wsadmin 脚本编制管理活动的和就绪的事务
您可以使用 wsadmin 脚本编制来管理可能需要管理员操作的活动和就绪的事务。
开始之前
关于此任务
在正常情况下,事务应该自动运行并完成(落实或回滚)而无需干预。但是,在某些情况下,您可能必须手动解析事务。
例如,您可能想回滚一个事务,而该事务在轮询资源管理器时卡住了且您知道它在要求的时间范围内将不会再变为可用。
在正常情况下,会尽力完成事务。但是,因为要完成资源恢复服务 (RRS) 和本机上下文,所以可能无法完成事务。在此情况下,事务标记为 rollback_only 以便它在下一个可用窗口中进行回滚。
在其他情况下,您可能需要手动完成事务。例如,您可能想完成一个事务,而该事务在轮询资源管理器时卡住了且您知道它在要求的时间范围内将不会再变为可用。
注: 如果您选择在应用程序服务器上完成事务,那么它在此服务器的事务服务日志中被记录为“已完成”,因此,该事务不能在服务器启动期间恢复。如果您完成了一个事务,那么应负责清除受影响资源管理器中的任何不确定事务。
有关 TransactionService 和事务 MBean 的更多信息,请参阅应用程序编程接口 (API) 文档。
过程
示例
以下脚本是如何使用 TransactionService 和 Transaction MBeans 来手动处理事务的示例。仅针对应用程序服务器而不要针对 Deployment Manager 或 Node Agent 运行该脚本。
Jacl 脚本示例:
# get the TransactionService MBean
set servicembean [$AdminControl queryNames type=TransactionService,*]
# get the Transaction MBean
set mbean [$AdminControl queryNames type=Transaction,*]
set input 0
while {$input >= 0} {
# invoke the listManualTransactions method
set tranManualList [$AdminControl invoke $servicembean listManualTransactions]
if {[llength $tranManualList] > 0} {
puts "----Manual Transaction details---------------"
set index 0
foreach tran $tranManualList {
puts " Index= $index tran= $tran"
incr index
}
puts "----End of Manual Transactions ---------------"
puts "Select index of transaction to commit/rollback:"
set input [gets stdin]
if {$input < 0} {
puts "No index selected, exiting."
} else {
set tran [lindex $tranManualList $input]
set commaPos [expr [string first "," $tran ]-1]
set localTID [string range $tran 0 $commaPos]
puts "Enter c to commit or r to rollback Transaction $localTID"
set input [gets stdin]
if {$input=="c"} {
puts "Committing transaction=$localTID"
$AdminControl invoke $mbean commit $localTID
}
if {$input=="r"} {
puts "Rolling back transaction=$localTID"
$AdminControl invoke $mbean rollback $localTID
}
}
} else {
puts "No Manual transactions found, exiting"
set input -1
}
puts " "
}
Jython 脚本示例:
import sys
def wsadminToList(inStr):
outList=[]
if (len(inStr)>0 and inStr[0]=='[' and inStr[-1]==']'):
tmpList = inStr[1:-1].split(" ")
else:
tmpList = inStr.split("\n") #splits for Windows or Linux
for item in tmpList:
item = item.rstrip(); #removes any Windows "\r"
if (len(item)>0):
outList.append(item)
return outList
#endDef
servicembean = AdminControl.queryNames("type=TransactionService,*" )
mbean = AdminControl.queryNames("type=Transaction,*" )
input = 0
while (input >= 0):
tranList = wsadminToList(AdminControl.invoke(servicembean, "listManualTransactions" ))
tranLength = len(tranList)
if (tranLength > 0):
print "----Manual Transaction details---------------"
index = 0
for tran in tranList:
print " Index=" , index , " tran=" , tran
index = index+1
#endFor
print "----End of Manual Transactions ---------------"
print "Select index of transaction to commit/rollback:"
input = sys.stdin.readline().strip()
if (input == ""):
print "No index selected, exiting."
input = -1
else:
tran = tranList[int(input)]
commaPos = (tran.find(",") -1)
localTID = tran[0:commaPos+1]
print "Enter c to commit or r to rollback transaction ", localTID
input = sys.stdin.readline().strip()
if (input == "c"):
print "Committing transaction=", localTID
AdminControl.invoke(mbean, "commit", localTID )
#endIf
elif (input == "r"):
print "Rolling back transaction=", localTID
AdminControl.invoke(mbean, "rollback", localTID )
#endIf
else:
input = -1
#endelse
#endElse
else:
print "No transactions found, exiting"
input = -1
#endElse
print " "
#endWhile