我正在尝试从我的应用程序在 AWS EventBridge 上安排一次性事件。我正在使用 AWS java SDK:
implementation(platform("software.amazon.awssdk:bom:2.20.56"))
implementation("software.amazon.awssdk:secretsmanager")
implementation("software.amazon.awssdk:eventbridge")
这是我安排活动的地方:
fun scheduleTask(ruleName: String, scheduledTime: ZonedDateTime) {
val ruleRequest = PutRuleRequest.builder()
.name(ruleName)
.scheduleExpression("at(${scheduledTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"))})")
.state("ENABLED")
.build()
//... rest of the code
}
这里的问题是 at(yyyy-MM-dd'T'HH:mm:ss) 模式给我以下错误:
参数 ScheduleExpression 无效。
但我确信计划表达式是有效的,因为它是在官方 AWS 文档中指定的https://docs.aws.amazon.com/scheduler/latest/UserGuide/schedule-types.html。
另外两个附注:
您提供的计划表达式是使用 at 表达式 的一次性计划。 CloudWatch Events 规则不支持此类表达式。
根据 CloudWatch Events 文档,在事件桥中仅支持基于速率和 cron 的表达式。EventBridge 主要支持使用 cron 表达式或针对计划事件的固定速率间隔来重复发生事件。
我们可以通过在规则执行后禁用该规则来开发一种解决方法:
val putRuleRequest = PutRuleRequest.builder()
.name(ruleName)
.scheduleExpression("cron(${scheduledTime.minute} ${scheduledTime.hour} ${scheduledTime.dayOfMonth} ${scheduledTime.monthValue} ? ${scheduledTime.year})")
.state("ENABLED")
.build()
// Successfully executed
DisableRuleRequest disableRuleRequest = new DisableRuleRequest()
.withName(ruleName);
但是,如果用例是围绕执行一次计划来响应事件,我建议使用 AWS。