0

我对 Windows Azure 和 Windows 工作流范围的事物完全陌生。

但基本上,我要实现的是云网络应用程序,它将负责将磁贴更新/徽章/toast 通知推送到我的 Winodws 8 应用程序。

运行以发送磁贴通知等的代码很好,但需要每隔一小时左右执行一次。

我决定最直接的方法是制作一个具有 WebAPI 的 MVC 应用程序,这个 WebAPI 将负责从发送它的 ModernApplication 接收 ChannelURI,并将其存储在 SQL Azure 上。

然后将有一个具有静态方法的类,该方法执行收集新数据和生成新 Tile/Badge/Toast 的逻辑。

我创建了一个简单的活动工作流,它有一个带有 DoWhile(true) 活动的序列。在这个 DoWhile 的主体内部,包含一个具有 InvokeMethod 和 Delay 的序列,InvokeMethod 将调用我的包含静态方法的类。延迟设置为一小时。

所以这似乎一切都好。然后我通过 Global.asax 中的 Application_Start 使用以下行启动此活动:

    this.ActivityInvoker = new WorkflowInvoker(new NotificationActivity());
    this.ActivityInvoker.InvokeAsync();

所以我只是用它测试了它,它似乎在设定的时间间隔运行我的自定义静态方法。

这一切都很好,但现在我有三个关于这种处理方式的问题:

  • 这是执行此操作的正确/最佳方法吗?如果没有,我应该研究哪些其他方法。
  • 如果在 Azure 上启动了一个新实例,我如何确保两个实例的运行工作流不会互相踩踏?即我如何确保 InvokeMethod 不会运行两次,我只希望它每小时运行一次,而不管有多少实例。
  • 如果实例崩溃/关闭,我如何确保它的状态保持不变?

非常感谢任何帮助、指导等。

4

1 回答 1

-1

我很想回答几个好问题,但是尝试在这样的论坛上做一些事情会很困难。但让我们试一试。至少要开始。

1)您实施计划任务的方法没有任何问题。我可以想到其他几种方法。就像使用 Do{Thread.Sleep(); 运行一个简单的 Worker 角色一样。...} 简单但有效。还有更复杂/优雅的方法,包括使用外部库和框架在 Azure 中安排任务。

2)您需要在您的工作流/作业处理引擎中实现某种单例类型模式。例如,您可以在作业开始时获得 1Kb blob 记录的租约,并且不允许另一个实例启动等。

有关更详细的答案,我建议我们将其离线并进行 Skype 通话并详细讨论您的要求。你知道如何通过电子邮件联系到我 :) 期待它。

于 2012-08-15T06:20:34.570 回答