3

我正在尝试配置 Spring Batch 侦听器以将消息发送到 Spring Integration Gateway 以获取 StepExecution 事件。

以下链接说明了如何使用 XML 进行配置

http://docs.spring.io/spring-batch/trunk/reference/html/springBatchIntegration.html#providing-feedback-with-informational-messages

如何使用 Spring Integration DSL 进行设置?我发现无法使用 DSL 配置具有服务接口的网关。

目前我通过实现一个实际的 StepExecutionListener 来解决这个问题,然后调用一个带有@MessagingGateway 注释的接口(调用相应的@Gateway 方法),以便将消息发送到通道。然后我为此通道设置了一个集成 DSL 流。

有没有更简单的方法使用 DSL,避免这种解决方法?是否有某种方法可以将批处理侦听器直接连接到网关,例如可以使用 XML 配置?

干杯,门诺

4

1 回答 1

1

首先,SI DSL 只是现有 SI Java 和 Annotation 配置的扩展,因此它可以与任何其他 Java 配置一起使用。当然,XML@Import也是可能的。

DSL 中没有网关配置,因为它的方法不能与 linear 连接IntegrationFlow。需要为每种方法提供下游流程。

因此,@MessagingGateway正确的方法是:

@MessagingGateway(name = "notificationExecutionsListener", defaultRequestChannel = "stepExecutionsChannel")
public interface MyStepExecutionListener extends StepExecutionListener {}

从另一边@MessagingGateway解析以及<gateway>标签解析最终得到GatewayProxyFactoryBean定义。因此,如果您不想引入新类,则只需声明该 bean:

@Bean
public GatewayProxyFactoryBean notificationExecutionsListener(MessageChannel stepExecutionsChannel) {
    GatewayProxyFactoryBean gateway = new GatewayProxyFactoryBean(StepExecutionListener.class);
    gateway.setDefaultRequestChannel(stepExecutionsChannel);
    return gateway;
}

在最新的Milestone 3之后,我有一个想法要介绍nested flows,什么时候我们可以引入对流Gateway的支持。像这样的东西:

@Bean
public IntegrationFlow gatewayFlow() {
        return IntegrationFlows
               .from(MyGateway.class, g -> 
                                         g.method("save", f -> f.transform(...)
                                                                .filter(...))
                                          .method("delete", f -> f.handle(...)))
               .handle(...)
               .get();                            
}

但是我不确定它是否会简化生活,因为任何嵌套的 Lambda 只会增加更多的噪音并且可能会破坏loosely coupling原则。

于 2014-09-11T07:27:12.160 回答