我有两台服务器(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的活动都抛出任何异常或失败,如何终止工作流程执行?
答案 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 Handling的AWS 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.
}
}