0

我正在使用Spring Cloud Data Flow Task DSL以编程方式在 Kubernetes 上启动 Spring Cloud Data Flow 任务。

查看spring-cloud-dataflow-rest-client项目的源代码,我可以看到DataFlowClientAutoConfiguration类包含一个RestTemplate正在运行的实例Autowired。我想RestTemplate主要传递我自己的实例,因为我想更改由RestTemplate

为此,我创建了自己的独立 Spring Boot 项目,该项目使用 spring-cloud-dataflow-rest-client 作为依赖项,并RestTempalte在我的上下文中创建了一个 bean,如下所示:

@SpringBootApplication
public class SpringDataFlowRestClient {

    public static void main(String[] args) {
        SpringApplication.run(SpringDataFlowRestClient.class, args);
    }
}

@Configuration
public class SpringDataFlowRestClientConfiguration {

    @Bean
    public RestTemplate restTemplate() {
        HttpComponentsClientHttpRequestFactory connectionFactory = new HttpComponentsClientHttpRequestFactory();
        connectionFactory.setConnectTimeout(300000);
        RestTemplate restTemplate = new RestTemplate(connectionFactory);
        return restTemplate;
    }

}

我的假设是这会增加RestTemplate5 分钟的连接超时;但是,很明显,我的自定义RestTemplate实例没有被拾取,DataFlowClientAutoConfiguration因为我看到许多请求在 30 秒内超时,因为我看到了 504 网关错误。(这就是我想首先增加超时的原因)

我在DataFlowTemplate.java中看到如下注释:

请注意,创建的 RestTemplate 将使用 JDK 的默认超时值。考虑传入自定义 {@link RestTemplate}

问题那么我究竟如何覆盖里面的RestTemplate实例?AutowiredDataFlowClientAutoConfiguration.

注意:我尝试public RestTemplate restTemplate(RestTemplateBuilder builder)在我的配置中使用 bean 方法,但这没有帮助。我试过设置spring.main.allow-bean-definition-overriding=true。我也尝试使用@Primary我的RestTemplatebean 方法。最后,我尝试将sun.net.client.defaultConnectTimeout=300000其作为环境变量传递。似乎没有任何效果。我相信我已经用尽了所有我能想到的选择。

4

1 回答 1

0

我也有同样的情况。我认为这是一个设计缺陷。首先,因为它可以在不注意的情况下向应用程序的主要用途 restTemplate 添加副作用(即身份验证)。此外,可能内部 dataFlowOperations() 应该将所有依赖项作为参数包含在签名中,因此我们可以通过执行类似的操作来引入行为而无需复制所有代码

@Bean
public DataFlowOperations dataFlowOperations(){
    return dataFlowClientAutoConfiguration.dataFlowOperations(myCustomRestTemplate(),..);
}

另一种选择是自动配置中的所有依赖项都是通过构造函数注入的,所以我们可以这样做

@Bean 
public DataflowOperations dataflowOperations(){
    return new DataFlowClientAutoConfiguration(restTemplate,...).dataFlowOperations
}

我认为现在满足我们需求的唯一方法是在本地复制所有 DataFlowOperations autconfiguration,使用反射(我完全固执地批准)或者将特定 dataflowClientRestTemplate 的整个拱门更改为 @Primary

于 2021-09-13T17:49:30.513 回答