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

在Jenkins中重复运行Java代码一段给定的时间

葛哲彦
2023-03-14
问题内容

我想运行Java代码一定时间,例如16个小时!我有一个大约运行一个小时的Java代码,我希望它可以重复运行16小时。因此,我有一个用户通过Jenkins传递的参数!我使用访问此值

System.getenv("Duration");

现在,我想在指定时间后退出执行。因此,假设用户选择了16,脚本应运行16个小时,然后退出。

如图所示,接受来自Jenkins用户的输入

我看到了其他一些问题,但是其中大多数问题与计时器处理的时间不是几秒钟就是几分钟。我需要一个有效的解决方案。谢谢 :)

仅供参考-环境-Jenkins + TestNG + Maven + Java

编辑:

long start = System.currentTimeMillis();
long end = start + durationInHours*60*60*1000;

while (System.currentTimeMillis() < end)
{
    //My code here runs for  approx. 50 mins!
}

现在假设用户选择值3小时,我希望3小时后退出while循环。但这并没有发生,因为在检查while条件时还没有完成3个小时。因此即使进入了第4次(因为经过的时间为150分钟而少于180分钟)它也进入了while条件,它在3小时10分钟后结束了。

如何在达到180分钟后退出while循环?

PS-我可以先做数学运算((迭代= durationFromUser /
codeDuration),然后运行for循环,但是我不想这样做,因为我的脚本长度可能有所不同。

编辑2:

boolean alive = true;
Timer timer = new Timer();

@Test() //Annotation from TestNG
public void public void jenkinsEntryPoint()
{
    String duration = System.getenv("Duration");
    int durationInHours=Integer.parseInt(duration);
     long end = System.currentTimeMillis() + durationInHours*60*60*1000;
 TimerTask task = new TimerTask() {
     public void run() {
        alive = false;
     };

 timer.schedule(task, end);
 while (alive) {
     //My code here runs for  approx. 50 mins!
     function1();
 }

}

void function1() {
  function2();
}

private void function2() {
 for(i=0;i<8;i++)
 {
  while(alive)
  {

    //long running code
    sleep(1000);
    //Some more code
    sleep(2000);
    //Some more code
    //Suppose time elapses here, I want it to quit
    //But its continuing to execute
    .
    . 
    .
    .

  }
 }
}

问题答案:

我尝试了ScheduledThreadPoolExecutor,它起作用了!

ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
exec.scheduleAtFixedRate(new Runnable() {
           public void run() {
               System.out.println("Time's Up According To ScheduledThreadPool");
               alive = false;
           }
       }, durationInHours, 1, TimeUnit.HOURS);

功能将在“ durationInHours”之后执行。

谢谢@TedBigham :)



 类似资料:
  • 问题内容: 我需要在预定义的时间长度内运行一些代码,当时间到时它需要停止。当前,我正在使用TimerTask来允许代码执行一段设定的时间,但这导致代码创建无尽的线程,并且效率很低。有更好的选择吗? 当前代码; 问题答案: 如果您使用的是Java5或更高版本,请考虑和。使用前者,您可以安排任务在指定的延迟后或以指定的时间间隔运行,因此,它可以更可靠地接管的角色。 该设施管理延迟(“每100毫秒运行一

  • 问题内容: 大约一年前,我偶然发现了Java的一个不错的功能,我一生都找不到。 通过一些魔术接口,显然可以在运行时声明一些可替换的类或函数。 我找到了一个很好的示例指南,该人运行了一个简单的小程序,该程序打印了一条特定的消息,然后他使用一种我不记得的方法更新了该程序,然后突然该程序将旧的打印功能替换为新的打印功能。 我尝试浏览Java API来激发我的记忆力和谷歌搜索功能,但没有成功。有人可以帮忙

  • 我有一个扩展Person类的学生类。我的超级类中没有equals方法,只有我的子类中的两个,如图所示。我正在尝试理解我的第二、第三和第四个print语句的运行时行为。语句1调用了接受学生参数的equals方法,这是有意义的,因为要比较的两个对象都是声明类型的学生。但是,语句2调用了接受人参数的equals方法,而最后两个语句调用了Object类中的equals方法。有人能解释一下为什么Java是动

  • 问题内容: 我对使代码在给定间隔内自动运行有一些疑问。我正在编程一种游戏模式,其中它检查玩家是否杀死了地图上的所有怪物(我有解决这些问题的方法)。我想知道编程此检查的最佳方法是什么?我已经研究了在类构造函数中某个人创建的方式。 但是我在网上看到人们在哪里 并用run方法进行检查。哪个更好?我只是想拥有每隔几秒左右运行一次的检查,查看玩家是否清除了地图,是否清除了地图,然后进行下一阶段。 问题答案:

  • 问题内容: 由于某种原因,没有关于在Java代码中运行liquibase的文档。我想为单元测试生成表。 我将如何直接在Java中运行它? 例如 问题答案: 它应该类似于(取自liquibase.integration.spring.SpringLiquibase源代码): ResourceAccessor有多种实现方式,具体取决于应如何找到更改日志文件。

  • 我一直认为一个不同于void的方法必须返回一个值,但无论如何,如果我们有这个,例如 这里没有编译时错误,我认为这是因为循环是无限的,C#可以保证它不会在不返回值的情况下终止。我说的对吗?