EventBridge 一次调度表达式错误

问题描述 投票:0回答:1

我正在尝试从我的应用程序在 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

另外两个附注:

  • 我用简单的速率(1 分钟)表达式进行了测试,效果很好
  • 我在调试中检查了时间格式的字符串,它与文档中的完全匹配 这是怎么回事?
aws-event-bridge aws-java-sdk
1个回答
0
投票

您提供的计划表达式是使用 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。

© www.soinside.com 2019 - 2024. All rights reserved.