2

我有一个简单的 Spring Integration 4 Java DSL 流,它使用DirectChannel'sLoadBalancingStrategy来循环Message对许多可能的 REST 服务的请求(即从两个可能的服务端点 URI 之一调用 REST 服务)。

我的流程当前是如何配置的:

@Bean(name = "test.load.balancing.ch")
public DirectChannel testLoadBalancingCh() {

    LoadBalancingStrategy loadBalancingStrategy = new RoundRobinLoadBalancingStrategy();
    DirectChannel directChannel = new DirectChannel(loadBalancingStrategy);
    return directChannel;
}

@Bean
public IntegrationFlow testLoadBalancing0Flow() {

    return IntegrationFlows.from("test.load.balancing.ch")
            .handle(restHandler0())
            .channel("test.result.ch")
            .get();     
}

@Bean
public IntegrationFlow testLoadBalancing1Flow() {

    return IntegrationFlows.from("test.load.balancing.ch")
            .handle(restHandler1())
            .channel("test.result.ch")
            .get();     
}

@Bean
public HttpRequestExecutingMessageHandler restHandler0() {
    return createRestHandler(endpointUri0, 0);
}

@Bean
public HttpRequestExecutingMessageHandler restHandler1() {
    return createRestHandler(endpointUri1, 1);
}

private HttpRequestExecutingMessageHandler createRestHandler(String uri, int order) {

    HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler(uri);
    // handler configuration goes here..
    handler.setOrder(order);
    return handler;

}

我的配置有效,但我想知道是否有使用 Spring Integration 的 Java DSL 配置流程的更简单/更好的方法?

干杯,下午

4

1 回答 1

2

首先RoundRobinLoadBalancingStrategy是 的默认值DirectChannel。所以,可以完全摆脱testLoadBalancingCh()bean定义。

此外,为了避免重复,您可以在as.channel("test.result.ch")上配置它。HttpRequestExecutingMessageHandlersetOutputChannel()

从另一面来看,您的配置非常简单,我看不出使用 DSL 的理由。您可以通过注释配置实现相同的目的:

@Bean(name = "test.load.balancing.ch")
public DirectChannel testLoadBalancingCh() {
    return new DirectChannel();
}

@Bean(name = "test.result.ch")
public DirectChannel testResultCh() {
    return new DirectChannel();
}

@Bean
@ServiceActivator(inputChannel = "test.load.balancing.ch")
public HttpRequestExecutingMessageHandler restHandler0() {
    return createRestHandler(endpointUri0, 0);
}

@Bean
@ServiceActivator(inputChannel = "test.load.balancing.ch")
public HttpRequestExecutingMessageHandler restHandler1() {
    return createRestHandler(endpointUri1, 1);
}

private HttpRequestExecutingMessageHandler createRestHandler(String uri, int order) {

    HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler(uri);
    // handler configuration goes here..
    handler.setOrder(order);
    handler.setOutputChannel(testResultCh());
    return handler;

}

从另一边有MessageChannels建造者工厂允许简化loadBalancer您的案例:

@Bean(name = "test.load.balancing.ch")
public DirectChannel testLoadBalancingCh() {
    return MessageChannels.direct()
             .loadBalancer(new RoundRobinLoadBalancingStrategy())
             .get();
}

但是,我可以猜测您希望避免在 DSL 流定义中重复到 DRY,但现在不可能。这是因为IntegrationFlow绕过标准对象创建的样板代码来绑定 endoints 是线性的。

正如你所看到的,Round-Robin我们必须复制,至少,inputChannel订阅几个MessageHandlers 到同一个频道。我们在 XML 中通过注解,当然还有 DSL 来做到这一点。

我不确定对于真正的应用程序来说,提供一个钩子来配置多个处理程序使用单个.handle()用于同一Round-Robin通道的处理程序是否有用。因为进一步的下游流程可能没有你的那么简单.channel("test.result.ch")

干杯

于 2014-08-12T13:56:54.000 回答