所以,我有一个场景,我定期调用SignalWorkflowExecution()传递工作流信令请求。在我编码的Decider中,我看到它在下一个轮询请求中接收事件历史中的信号(以及在它之后开始的决策任务)。
我的问题是,如何防止第二次处理信号?也就是说,如果我收到信号,然后提交新的活动进行工作,那么信号是否还会出现在事件的历史中?我没有看到将信号与任何后续决策任务相关联的方法,并且不建议在Decider中维护状态,因为这是SWF的目的。
决策者是否还要对其他任务列表进行轮询?也就是说,如果我的决策者收到执行操作A的信号,然后它创建一个新的决定来安排任务列表X上的活动A(操作A的工作人员正在进行轮询),那么决策者期望轮询任务列表X也看到如果某项活动已安排进行行动A?否则,我不知道你每次获得一个新信号时都是如何避免一次又一次地处理信号,所有以前的信号都在历史中,所以我该如何避免重新处理它们呢?
我找不到很多关于使用信号的信息。我只看到一个页面,它没有解释如何处理决策器中的信号。
我只需要知道在工作流程中处理信号的“正确”方式。
答案 0 :(得分:1)
当您致电PollForDecisionTask
时,回复中的一个参数是previousStartedEventId
(重点已添加):
由决策程序处理的此工作流程执行的先前决策任务的DecisionTaskStarted事件的ID。 这可用于确定自决策者收到的上一个决策任务以来历史记录中的事件。
通常,每个决策任务都应该处理自上一个决策任务以来的新事件。这不仅仅是信号 - 对于已完成的活动任务,子工作流程,取消请求等,它的工作原理相同。
答案 1 :(得分:0)
使用.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;
}
}