【问题标题】:How to simulate sending periodic task on Elastic Beanstalk server?如何在 Elastic Beanstalk 服务器上模拟发送周期性任务?
【发布时间】:2020-12-06 18:42:44
【问题描述】:

我已经设置了一个 Elastic Beanstalk 服务器,工作层。它有一个 cron.yaml 每小时运行一个任务,如下所示:

version: 1
cron:
 - name: "broadcast-users"
   url: "/broadcast"
   schedule: "0 * * * *"

我知道它是通过 SQS 向工作队列发送消息,然后由该路由接收 - 但我不知道该消息是什么样的。我希望能够轻松测试 cron 作业,而无需等待预定时间的到来。

是否有人会从 SQS 发出什么消息来启动这个 cron 工作? (或者我如何检查发送到 SQS 的消息的内容?)

谢谢!

【问题讨论】:

    标签: amazon-web-services amazon-ec2 amazon-elastic-beanstalk amazon-sqs


    【解决方案1】:

    如果您从 AWS SQS 控制台发送,试试这个,

    Message Body 标签中,输入elasticbeanstalk scheduled job

    Message Attributes 中,输入以下内容:

    Name: beanstalk.sqsd.path
    Type: String
    Value: jobs/example-job <- Whatever the URL of  your job is
    
    Name: beanstalk.sqsd.scheduled_time
    Type: String
    Value: '2018-04-07T20:38:00-04:00' <- When you want it scheduled
    

    请注意,对于 beanstalk.sqsd.path 值,如果我包含前导斜杠,我将无法使其工作,例如/jobs/example-job 导致队列中有一条孤独的消息,而 jobs/example-job 工作。

    在我的 cron.yaml 中,我将 URL 指定为 /jobs/example-job,以防您想知道。

    【讨论】:

    • 您是如何获得sqsd 的属性名称的?我想看看beanstalk sqsd 的可能配置是什么。
    【解决方案2】:

    您应该能够使用 SQS 控制台查看消息的内容。该消息可能最终会出现在死信队列中。

    话虽如此,消息内容应该是这样的:

    { "taskurl": "broadcast", "taskname": "broadcast-users" }
    

    您也可以使用 SQS 控制台手动发送消息:

    • 选择适当的队列。
    • 从“队列操作”下拉列表中选择“发送消息”。
    • 输入 JSON 消息正文(如{ "taskurl" : "broadcast", "taskname" : "broadcast-users" })并点击“发送消息”。

    在您的控制器中,您可以查看 X-Aws-Sqsd-Taskname 标头以确定调用了哪个任务。

    【讨论】:

    • 我的工人在 /worker 路由处理 SQS 消息并在 /broadcast 路由接收 cron 任务。当我尝试发送该消息时,它被 /worker 路由接收。 JSON 中是否有一个属性可以将其发送到 /broadcast? (也许我对 cron 处理的工作方式有误,也许它根本没有从 SQS 触发?)
    • 如果您通过 SQS 控制台手动发送消息,它将被发送到您在 ElasticBeanstalk 中配置的任何端点。 cron.yaml 中定义的任务可以通过url 参数发送到任意端点。
    【解决方案3】:

    亚马逊在他们的知识中心 (here) 中回答了这个问题。简而言之,您可以通过 SSH 连接到工作人员并使用 curl 通过其 URL 立即测试作业...

    curl -H "Content-Type: application/json" -X POST http://localhost/<path>
    

    ...&lt;path&gt; 是您要测试的作业的路径。您还可以使用-d 选项传递参数:

    curl -d param1=value1 -d param2=value2 -H "Content-Type: application/json" -X POST http://localhost/<path>
    

    【讨论】:

      【解决方案4】:

      转到 AWS SQS gui(例如 https://eu-central-1.console.aws.amazon.com/sqs/v2/home#/queues)并选择您的队列。如果您不知道自己的队列,请导航到 EBS 工作器配置并查看 工作器 部分。注意 Worker queue URL 并选择 URL 的最后一部分。应该看起来像这样awseb-e-3j7sjaqxre-stack-AWSEBWorkerQueue-3WR7QFDPTDEH1。在队列列表中搜索,选择并单击Send and receive messages 按钮。

      消息正文文本区域中输入elasticbeanstalk scheduled job

      添加三个消息属性

      Name: beanstalk.sqsd.path
      Type: String
      Custom Type: (empty)
      Value: /jobs/example-job <- cron.url from your cron.yaml
      
      Name: beanstalk.sqsd.task_name
      Type: String
      Custom Type: (empty)
      Value: example-job <- cron.name from your cron.yaml
      
      Name: beanstalk.sqsd.scheduled_time
      Type: String
      Custom Type: (empty)
      Value: '2020-12-06T11:07:00+01:00' <- It did not work without this entry
      

      发送消息!

      我不知道为什么,但是如果没有 beanstalk.sqsd.scheduled_time 属性,这项工作就无法开始。即使属性值被忽略!工作立即开始。

      【讨论】:

        猜你喜欢
        • 2018-12-18
        • 1970-01-01
        • 2013-12-05
        • 2015-04-17
        • 1970-01-01
        • 2016-11-28
        • 2015-10-10
        • 2013-06-13
        • 2021-01-22
        相关资源
        最近更新 更多