我有一个应用程序指定一个简单的流程,其中需要以特定顺序调用服务链来执行某些功能。 Spring集成及其DSL似乎适合这种情况。
允许任何这些单独的服务失败(这些服务是对外部应用程序的调用),此时链应该停止。不仅如此,控制流程还需要在其他地方重定向,具体取决于故障服务。换句话说,我需要为每个服务使用不同的错误处理程序。
问题是我很难找到如何做到这一点,如果有人能指出我正确的方向,我将非常感激。这就是我到目前为止解决问题的方法:
@Configuration
@EnableAutoConfiguration
@IntegrationComponentScan
public class Application {
public static void main(String[] args) throws InterruptedException {
ConfigurableApplicationContext ctx =
SpringApplication.run(Application.class, args);
System.out.println(ctx.getBean(MySource.class).send("foo"));
ctx.close();
}
@MessagingGateway
public interface MySource {
@Gateway(requestChannel = "flow.input")
String send(String string);
}
@Bean
public IntegrationFlow flow() {
return f -> f
.handle(String.class, (i, map) -> {
// if (true){
// throw new RuntimeException();
// }
System.out.println(i);
return i + "a";
})
.handle(String.class, (i, map) -> {
System.out.println(i);
return i + "b";
})
.handle(String.class, (i, map) -> {
System.out.println(i);
return i + "c";
});
}
}
我一直在搜索如何为每个处理程序设置错误处理程序/通道,但我找不到任何有用的东西。
我几乎放弃了我的搜索并开始编写自己的代码(叹息),它看起来像这样:
public class FlowHarness {
public static void main(String[] args) {
Flow flow = FlowBuilder.flow()
.nextStep(i -> ((Integer)i) + 1, e -> System.out.println("failed at step 1"))
.nextStep(i -> ((Integer)i) + 1, e -> System.out.println("failed at step 2"))
.nextStep(i -> ((Integer)i) + 1, e -> System.out.println("failed at step 3"))
.build();
flow.execute(new Integer(1));
}
}
.nextStep()的左侧参数是处理程序,而右侧参数是错误处理程序。这是非常简单的,但我希望它说明了这一点。
尽管所有现实生活中的流程都可以写成一个大类,但我认为将每个子流分解为单独的私有方法/类会更方便。非常感谢。
答案 0 :(得分:2)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int compare (const void * ca, const void * cb)
{
char **a = (char **)ca;
char **b = (char **)cb;
return strcmp(*a, *b);
}
int main()
{
int numnam, j;
char *names[] = {"Ellin","Alexa","Eliza","Celiza"};
numnam = sizeof(names)/sizeof(char *);
qsort(names, numnam, sizeof(char *), compare);
for (j = 0 ; j < numnam; j++)
printf("%s \n", names[j]);
return 0;
}
可以提供.handle()
(以及任何其他消费者端点):http://docs.spring.io/spring-integration/docs/4.3.9.RELEASE/reference/html/messaging-endpoints-chapter.html#expression-advice
ExpressionEvaluatingRequestHandlerAdvice
答案 1 :(得分:0)
由于您希望链在失败时停止执行。我建议您可以使用适当的处理程序使用自定义异常