打算如何处理 Amazon SWF 信号?

How are Amazon SWF signals intended to be processed?

所以,我有一个场景,我定期调用 SignalWorkflowExecution() 传递工作流信号请求。在我编写的决策程序中,我看到它在下一个轮询请求时收到事件历史记录中的信号(决策任务紧随其后开始)。

我的问题是,如何防止第二次处理该信号?也就是说,如果我得到信号,然后提交一个新的 activity 工作,信号不会仍然在事件历史中吗?我看不到将信号与任何后续决策任务相关联的方法,并且不推荐在 Decider 中维护状态,因为这正是 SWF 的目的。

Decider 是否还要轮询其他任务列表?也就是说,如果我的 Decider 接收到执行操作 A 的信号,然后它创建一个新的决策以在任务列表 X 上安排 activity A(操作 A 的工作人员正在轮询),那么 Decider 是否应该轮询任务列表X 还要查看是否已为操作 A 安排了 activity?否则,我看不出每次收到新信号时如何避免一遍又一遍地处理信号,所有以前的信号都在历史记录中,那么如何避免重新处理它们呢?

我找不到很多关于使用信号的信息。我只看到一页,它没有解释如何处理决策程序中的信号。

我只需要知道 "right" 在工作流中处理信号的方法。

当您打电话给 PollForDecisionTask, one of the parameters on the response is previousStartedEventId 时(强调已添加):

The ID of the DecisionTaskStarted event of the previous decision task of this workflow execution that was processed by the decider. This can be used to determine the events in the history new since the last decision task received by the decider.

一般来说,每个决策任务都应该处理自上一个决策任务以来的新事件。这不仅适用于信号 - 它适用于已完成的 activity 任务、子工作流、取消请求等。

直接使用其.NET SDK 对Amazon SWF 进行编程非常困难且容易出错。如果你想坚持你的实施,那么 Kobi 的回答是正确的。

但是您可能会发现 Guflow,一个用于对 Amazon SWF 进行编程的开源 C#.NET 库,useful.I 是该库的作者。这是一个示例,它显示了暂停和发出工作流信号是多么容易:

[WorkflowDescription("1.0")]
public class OrderWorkflow : Workflow
{
    public OrderWorkflow()
    {
        ScheduleActivity<ReserveOrder>().OnFailure(PauseWhenItemIsNotAvailable);

        ScheduleActivity<ChargeCustomer>().AfterActivity<ReserveOrder>();

        ScheduleActivity<ShipOrder>().AfterActivity<ChargeCustomer>();
    }

    private WorkflowAction PauseWhenItemIsNotAvailable(ActivityFailedEvent e)
    {
        return e.Reason == "NotAvailable" ? Ignore : DefaultAction(e);
    }
    [WorkflowEvent(EventName.Signal)]
    public WorkflowAction SignalEvent(WorkflowSignaledEvent @event)
    {
        if (@event.SignalName == "ItemsArrived" && Activity<ReserveOrder>().LastFailedEvent()?.Reason=="NotAvailable")
            return Jump.ToActivity<ReserveOrder>();
        return Ignore;
    }
}