当前位置: 首页 > 知识库问答 >
问题:

Spring@计划注释随机延迟

韩良策
2023-03-14

我正在使用Spring框架中的@计划的注释来调用一个方法。但是我的设置中有多个节点,我不希望它们完全同时运行。所以我想给初始延迟设置一个随机值来抵消它们。

import org.springframework.scheduling.annotation.Scheduled;

@Scheduled(fixedRate = 600000, initialDelay = <random number between 0 and 10 minutes> )

不幸的是,这里只允许我使用常量表达式。还有别的办法吗?我想到了使用Spring表达式语言。

共有3个答案

隆芷阳
2023-03-14

在这个工作示例中,随机延迟将在5到10秒之间。

@Scheduled(fixedDelayString = "#{new Double((T(java.lang.Math).random() + 1) * 5000).intValue()}")
贺海
2023-03-14

要将初始延迟随机设置在0和fixedRate之间,请尝试以下操作:

@Scheduled(fixedDelayString = "${some.delay}", initialDelayString = "${random.int(${some.delay})}")

在这里,您将some.delay(但选择一个更合适的名称)定义为10分钟,就像application.properties或等价物中的属性一样。

some.delay = 600000

当然,如果你想偷懒并且硬编码,你可以使用${random.int(600000)}

杨轶
2023-03-14

您可以通过Spring表达式语言配置缩写:

@Scheduled(fixedRate = 600000, initialDelayString = "#{ T(java.util.concurrent.ThreadLocalRandom).current().nextInt(10*60*1000) }" )

我现在没有IDE来测试代码,所以您可能需要对其进行一些调整。

 类似资料:
  • 我试图执行一个方法,使用注解@计划和cron值。该方法执行但不尊重cron。 这是我的课: 我的应用程序上下文的一部分。xml: 我将Spring 3.1与Spring-task-3.1结合使用。xml中的xsd。 当我开始的时候,我应该每10秒写一行,我得到了这个: 每次执行之间的延迟每次都会改变。我用FixedRate或FixedDelay进行了测试,但得到了相同的结果。 因此,类和方法都被正

  • 我有一个简单的计划任务,它是使用@计划注释创建的。类似这样的东西- 我还有一个蓝绿色升级场景,在这个场景中,这个计划任务可能会在蓝色和绿色集群中运行。鉴于这个计划任务修改了数据库,其中一个节点可能会覆盖来自另一个节点的数据——或者最坏情况下的竞争条件。 我想暂停绿色集群上所有计划的任务,直到它准备好接受流量。我已经有了代码来监听应用程序状态的变化。 我探索了几个选择- 只需在任务开始时添加一个布尔

  • 给定一个随机数生成器random(7),它可以以相等的概率生成数字1,2,3,4,5,6,7(即每个数字出现的概率为1/7)。现在我们要设计一个随机数(5),它能以相等的概率(1/5)生成1,2,3,4,5。 有一种方法:每次我们随机运行(7),只有当它生成1-5时才返回。如果是6或7,再运行一次,直到它是1-5。 我有点困惑。第一个问题是: 如何用数学方法证明每个数字发生的概率是1/5?例如,假

  • 我正在使用Spring MVC,我正在尝试编写一个每小时运行一次的计划任务。问题是,当应用程序启动时,它应该计算到下一个小时的持续时间,并将该值用作初始延迟。这样,计划的任务可以在精确的时间运行,比如下午1点。。。下午2点。。。下午三点等等。 在下面的代码中,我试图计算@PostConstruct注释中的初始延迟。但是,当我尝试在@Sched的注释中使用变量时,会收到以下错误消息:注释属性Sche

  • 我编程用java代码生成jmeter测试计划。 然后我开始这个测试计划: 这很有效。现在我需要用不同的employeeId(随机)发送请求。在JMeter GUI中,我们可以使用随机函数随机测试。 提供JMeter API这样的功能?我们怎样才能随机化我们的请求?或者我们必须用for循环替换LoopController?

  • 如果我使用,那是什么意思?极高?