使用AWS SWF的分布式体系结构中的活动管理

时间:2014-09-24 03:02:43

标签: amazon-web-services amazon-ec2 amazon-swf

我有两台服务器(EC2实例)。在一台服务器(服务器1)中,我有3批,另一台(服务器2)我有4批。现在,只有在服务器1中成功执行批处理后,才需要执行服务器2中的一个批处理。

更新

    Promise<Void> r12 = null
    new TryCatchFinally(){

    // First server job sequencing
    Promise<Void> r11 = client1.b1();
    r12 = client1.b2(r11);
    Promise<Void> r13 = client1.b3(r12);
    Promise<Void> r14 = client1.b4(r13);
    }
    @Override
    protected void doCatch(Throwable e) throws Throwable {
    System.out.println("Failed to execute commands in server 1");
    }
    @Override
    protected void doFinally() throws Throwable {
    // cleanup
    }       
    }
    new TryCatchFinally(){

    // Second server job sequencing
    Promise<Void> r21 = client2.b1();
    // Will execute only when both parameters are ready
    Promise<Void> r22 = client2.b2(r21, r12);
    Promise<Void> r23 = client2.b3(r22);
    Promise<Void> r24 = client2.b4(r23);
    }
    @Override
    protected void doCatch(Throwable e) throws Throwable {
    System.out.println("Failed to execute commands in server 2");
    }
    @Override
    protected void doFinally() throws Throwable {
    // cleanup
    }       
    }

任何服务器中的任何活动都可以抛出任何自定义异常。但是,由于另一个服务器中的活动抛出异常,因此不应取消服务器中任何活动的执行。只有在其自身服务器中的某个活动引发任何异常时,才应取消服务器中的活动。 (如果服务器所依赖的活动失败或抛出任何异常,则依赖活动也应该被取消,而不管服务器如何)。为此我所做的就是把它包装成两个独立的try catch块。

如果服务器1和服务器2的活动都抛出任何异常或失败,如何终止工作流程执行?

1 个答案:

答案 0 :(得分:1)

您可以将每个Spring Batch执行包装到SWF活动中,然后使用SWF决策程序对这些活动进行排序。有关详细信息,请参阅AWS Flow Framework文档和recipes

阅读更新后的问题说明后添加:

您可以使用Promises以任何方式对活动进行排序。所以在你的情况下,我会做类似的事情:

// First server job sequencing
Promise<Void> r11 = client1.b1();
Promise<Void> r12 = client1.b2(r11);
Promise<Void> r13 = client1.b3(r12);
Promise<Void> r14 = client1.b4(r13);

// Second server job sequencing
Promise<Void> r21 = client2.b1();
// Will execute only when both parameters are ready
Promise<Void> r22 = client2.b2(r21, r12);
Promise<Void> r23 = client2.b3(r22);
Promise<Void> r24 = client2.b4(r23);

如果任何活动抛出异常,它将取消所有未完成的活动并使工作流失败,除非明确捕获并使用TryCatchFinally处理异常。未启动的活动(例如因为它正在等待Promise类型的参数准备就绪)会立即取消。正在执行的活动应明确处理取消。参见&#34;活动心跳&#34; Error HandlingAWS Flow Framework Guide页面中的部分了解详情。

添加了错误处理部分:

您在TryCatch中包装不应影响工作台其他部分的部分。因此,在此示例中,任何抛出异常的client2活动都会取消所有将来的client2活动,但不会取消在client1上调用的活动,因为异常不会被抛入其范围。

// First server job sequencing
Promise<Void> r11 = client1.b1();
final Promise<Void> r12 = client1.b2(r11);
Promise<Void> r13 = client1.b3(r12);
Promise<Void> r14 = client1.b4(r13);

new TryCatch(){

  @Override
  protected void doTry() throws Throwable {
    // Second server job sequencing
    Promise<Void> r21 = client2.b1();
    // Will execute only when both parameters are ready
    Promise<Void> r22 = client2.b2(r21, r12);
    Promise<Void> r23 = client2.b3(r22);
    Promise<Void> r24 = client2.b4(r23);
  }

  @Override
  protected void doCatch(Throwable e) throws Throwable {
    // Handle exception without rethrowing it.
  }
}