在我的代码中,我有一个解析日志文件并返回结果列表的方法。没有NonCPS,它可以完美工作并返回正确的值。从管道阶段调用此方法,并且得到了java.io.NotSerializableException:java.util.regex.Matcher,这就是为什么我放置@NonCPS批注的原因。不再抛出异常,但是log_parser方法不能正常工作。现在,它总是返回整个文件-即使删除return result_list。调用此方法的结果始终是文件。
@NonCPS
def log_parser(String filename){
def result_list = []
def match_f, match_s
def lines = readFile(filename).readLines()
for( line in lines ) {
match_f = (line =~ /(?<=Failures: )[^ ]+/ )
match_s = (line =~ /(?<=Skips: )[^ ]+/ )
if( match_f ) {
result_list[1] = (match_f[0]).replace(",", "") }
if( match_s ) {
result_list[2] = (match_s[0]).replace(",", "") }
}
return result_list
}
答案 0 :(得分:2)
因为管道会将所有变量(包括函数内部的局部变量)序列化为默认行为,但是java.util.regex.Matcher
不可序列化,这就是为什么会出错的原因。
选项1)一旦使用完毕,立即释放不可序列化的变量。
def log_parser(String filename){
def result_list = []
def match_f, match_s
def lines = readFile(filename).readLines()
for( line in lines ) {
match_f = (line =~ /(?<=Failures: )[^ ]+/ )
match_s = (line =~ /(?<=Skips: )[^ ]+/ )
if( match_f ) {
result_list[1] = (match_f[0]).replace(",", "")
match_f = null
}
if( match_s ) {
result_list[2] = (match_s[0]).replace(",", "")
match_s = null
}
}
return result_list
}
选项2)将不可序列化的变量移动到带有注释的函数中:@NonCPS
,在@NonCPS函数内部,我们不能调用任何其他管道步骤,因此,您应该将readFile
从log_pareser()
中移出
log_parser(readFile(<log file path>))
@NonCPS
def log_parser(String fileContent){
def result_list = []
def match_f, match_s
def lines = fileContent.readLines()
for( line in lines ) {
match_f = (line =~ /(?<=Failures: )[^ ]+/ )
match_s = (line =~ /(?<=Skips: )[^ ]+/ )
if( match_f ) {
result_list[1] = (match_f[0]).replace(",", "") }
if( match_s ) {
result_list[2] = (match_s[0]).replace(",", "") }
}
return result_list
}