首页 文章

如何处理Amazon SWF信号?

提问于
浏览
1

所以,我有一个场景,我定期调用SignalWorkflowExecution()传递工作流信号请求 . 在我编码的Decider中,我看到它在下一个轮询请求中接收事件历史中的信号(以及在它之后开始的决策任务) .

我的问题是,如何防止第二次处理信号?也就是说,如果我收到信号,然后提交新的活动进行工作,那么信号是否还会出现在事件的历史中?我没有看到将信号与任何后续决策任务相关联的方法,并且不建议在Decider中维护状态,因为这是SWF的目的 .

决策者是否还要对其他任务列表进行轮询?也就是说,如果我的决策者收到执行操作A的信号,然后它创建了一个新的决定来安排任务列表X上的活动A(操作A的工作人员正在轮询),那么决策者期望轮询任务列表X也看到如果某项活动已安排进行行动A?否则,我不知道你每次获得一个新信号时都是如何避免一次又一次地处理信号,所有以前的信号都在历史中,所以我该如何避免重新处理它们呢?

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

我只需要知道处理工作流中信号的“正确”方法 .

2 回答

  • 0

    当您调用PollForDecisionTask时,响应中的一个参数是previousStartedEventId(强调添加):

    决策程序处理此工作流程执行的先前决策任务的DecisionTaskStarted事件的ID . 这可以用于确定自决策者接收的最后一个决策任务以来历史中的事件 .

    通常,每个决策任务应该处理自上一个决策任务以来的新事件 . 这不仅仅是信号 - 对于已完成的活动任务,子工作流程,取消请求等,它的工作原理相同 .

  • 1

    使用.NET SDK直接编程Amazon SWF非常困难且容易出错 . 如果您希望坚持实施,那么Kobi的答案是正确的 .

    但是你可能会发现Guflow,一个用于编程Amazon SWF的开源C#.NET库,非常有用 . 我是这个库的作者 . 这是一个示例,显示您可以轻松地暂停和发出工作流信号:

    [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;
        }
    }
    

相关问题