【问题标题】:AWS SWF createTimer promise not returningAWS SWF createTimer 承诺不返回
【发布时间】:2014-07-28 22:04:36
【问题描述】:

我想要一个循环,在每次迭代后等待一段时间。我正在尝试使用计时器进行等待,但计时器永远不会返回,所以下面的代码只运行一次,然后永远等待。当我删除计时器条件时,代码成功执行。没有错误,它只是等待......

感谢任何帮助!

@override
public void doWorkflow() {
    validate("test", 1);
}

@Asynchronous
private void validate(String id, int retries, Promise<?>... waitFor) {
    Promise<Boolean> isValid = activityClient.validate(id);

    doWork(id, retries, isValid);
}

@Asynchronous
private void doWork(String id, int retries, Promise<Boolean> isValid) {
    if (!isValid.get()) {
        return;
    }

    Promise<Void> waitFor = decisionContext.getWorkflowClock().createTimer(5);

    validate(id, retries - 1, waitFor);
}

【问题讨论】:

    标签: amazon-web-services amazon-swf


    【解决方案1】:

    我使用 Spring 来设置应用程序。获取我正在使用的决策上下文

    @Autowired
    DecisionContext decisionContext
    

    问题是在构建工作流实现时我没有使用范围。解决方案是添加 scope="workflow" 属性:

    <bean id="myWorkflow" class="com.example.myWorkflowImpl" scope="workflow">
    

    执行此操作后,工作流历史记录开始显示 TimerStarted 事件。

    【讨论】:

      【解决方案2】:

      我没有发现您的代码有任何明显的问题。首先,我会查看工作流程历史记录(通过控制台或使用WorkflowExecutionHistoryPrinter 打印)以查看计时器是否已安排以及是否触发。如果历史看起来没问题,我会使用WorkflowExecutionFlowThreadDumper 获得“异步线程转储”,以查看您的代码究竟在等待什么。

      【讨论】:

      • 按照您的建议,我可以看到计时器没有触发
      猜你喜欢
      • 1970-01-01
      • 2016-12-30
      • 2016-06-15
      • 1970-01-01
      • 1970-01-01
      • 2018-02-15
      • 2015-10-30
      • 1970-01-01
      • 2015-11-27
      相关资源
      最近更新 更多