当前位置: 首页 > 面试题库 >

Jenkins Groovy如何在不结束管道的情况下从@NonCPS方法调用方法

尉迟浩思
2023-03-14
问题内容

我需要在Jenkins Pipeline中解析一些JSON并在循环中调用一些常规方法,但是脚本始终在第一个函数调用后退出。这该怎么做?

import groovy.json.JsonSlurper
import com.cloudbees.groovy.cps.NonCPS

@NonCPS
def myMethod(String json) {
    def jsonSlurper = new JsonSlurper()
    def jsonObject = jsonSlurper(json)
    jsonObject.each {
        obj ->
            switch(obj.name) {
                case "foo":
                    doAThing(obj)
                    break
                case "bar":
                    doAnotherThing(obj)
                    break
            }
    }
}

在上面的示例中,即使使用json对象,例如:

[{
    "name": "foo"
}, {
    "name": "bar"
}]

…管道总是在第一次迭代后退出。据推测这是由于混合了同步和异步功能。有什么办法吗?


问题答案:

我已经通过执行以下操作基本上解决了此问题:

import groovy.json.JsonSlurper

def myMethod(String json) {
    def jsonSlurper = new JsonSlurper()
    def jsonObject = jsonSlurper(json)
    jsonSlurper = null
    for(int i = 0; i < jsonObject.size(); i++) {
        switch(jsonObject[i].name) {
            case "foo":
                doAThing(jsonObject[i])
                break
            case "bar":
                doAnotherThing(jsonObject[i])
                break
        }
    }
}

使用完JsonSlurper实例后,立即销毁它,删除@NonCPS批注,切换到C样式的for循环,而不是每个循环。



 类似资料:
  • 我试图在不使用导入语句的情况下从Arrays类调用这个方法:你能告诉我怎么了吗? 非常感谢

  • 这是一个使用合并排序的程序,从1到1000对1000个数字的列表进行排序。它显示原始列表,然后调用递归方法对其进行排序,然后显示。 代码中我不明白的是这两行: 合并排序(数字,低,中);//在方法中,它会说“这里” 合并排序(数字,中间1,高); 我是java的初学者,这与我所学的一切背道而驰,因为我无法理解如何在方法中调用方法。除非它是一个我怀疑的对象。有人能解释一下这两行代码的作用吗?

  • 问题内容: 我正在开发一个网站,用户使用ajax,php和POST方法提交凭据,我想保护登录凭据的格式不是纯文本,但我不想使用SSL我可以在不使用SSL证书的情况下保护密码凭据吗? 谁能给我任何方法的工作示例? 问题答案: 没有一些通道外验证(SSL提供),您将无法完全保护凭据。一个在中间攻击的人永远是可能的。 简而言之,客户端无法完全确定他们正在与服务器通信,而不是在两者之间插入假服务器。

  • 问题内容: 我在Go中创建了Direct3D9包装器,该包装器使用CGo与C中的COM对象进行接口。 我想摆脱Windows下对C编译器的依赖,因此用户不必安装MinGW或Cygwin即可使用Go中的DirectX。 问题在于d3d9.dll不会公开C函数,而是使用COM。加载DLL(带有)后,可以直接调用的唯一函数是。这将返回一个COM对象,该对象将所有功能公开为方法。 如何在没有CGo的纯Go

  • 问题内容: 这是使用awt包的Java图形的初学者问题。我在网上找到了这段代码来绘制一些简单的图形。 在main方法中,在画布上没有调用paint()。但是我运行了该程序并且它可以工作,那么paint()方法如何运行? 问题答案: 该方法由事件调度线程(EDT)调用,并且基本上不受您的控制。 它的工作方式如下:当 实现 用户界面(以您的情况为例)时,Swing将启动EDT。然后,此EDT线程在后台

  • 本文向大家介绍Java如何利用return结束方法调用,包括了Java如何利用return结束方法调用的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java如何利用return结束方法调用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下: 效果如下: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教