首页 文章

如何在前一个活动仍在激活时定期安排相同的活动

提问于
浏览
0

我的目标是 Build 一个工作流,定期(每30秒)向taskList添加一个相同的活动(只做1分钟的睡眠) . 此外,我有多台托管活动工作者的机器同时轮询taskList . 当活动安排好后,其中一个工作人员可以轮询并执行 .

我尝试使用cron装饰器来创建DynamicActivityClient,并使用DynamicActivityClient.scheduleActivity()定期调度活动 . 但是,似乎在最后一个活动完成之前不会安排活动 . 在我的情况下,活动每1分钟而不是30秒安排,我在cron模式中设置 .

包结构与aws sdk示例代码几乎相同:cron是否有任何其他结构建议实现此目的?我对SWF很新 . 任何建议都非常感谢 .

2 回答

  • 0

    cron装饰器内部依赖于AsyncScheduledExecutor,它是按设计编写的,等待调用方法中的所有异步代码在再次调用cron之前完成 . 因此,您正在目睹的行为是可以预期的 . 解决方法是不从cron下的代码调用活动,而是从不同范围内的代码调用活动 . 就像是:

    // This is a field
    Settable<Void> invokeNextActivity = new Settable<>();
    
    void executeCron() {
        scheduledExecutor.execute(new AsyncRunnable() {
    
            @Override
            public void run() throws Throwable {
                // Instead of executing activity here just unblock
                // its execution in a different scope.
                invokeNextActivity.set(null);
            }
        });
        // Recursive loop with each activity invocation 
        // gated on invokeNextActivity
        executeActivityLoop(invokeNextActivity);
    }
    
    @Asynchronous
    void executeActivityLoop(Promise waitFor) {
       activityClient.executeMyActivityOnce();
       ivnokeNextActivity = new Settable<>();
       executeActivityLoop(ivnokeNextActivity);
    }
    

    我建议阅读TryCatchFinally文档以了解错误处理和范围 .

    另一种选择是重写AsyncScheduledExecutor来调用invoked.set(lastInvocationTime),而不是从doFinally调用,但是在调用command.run()之后立即调用

  • 0

    您可以通过编写更简单的工作流代码并使用工作流时钟和计时器来实现 . 请参阅以下链接中的示例 . http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/executioncontext.html

    还记得一件事 . 工作流程执行中允许的最大事件数为25000.因此,cron作业将永远不会运行,但您必须编写代码以在一段时间后开始新的工作流程执行 . 请参阅以下链接提供的连续工作流程示例http://docs.aws.amazon.com/amazonswf/latest/awsflowguide/continuous.html

相关问题