【发布时间】:2021-09-10 04:30:17
【问题描述】:
我正在使用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;
}
}
我的假设是这会将RestTemplate 的连接超时时间增加到 5 分钟;但是,很明显,DataFlowClientAutoConfiguration 没有获取我的自定义 RestTemplate 实例,因为我看到许多请求在 30 秒内超时,因为我看到了 504 网关错误。 (这就是我一开始想增加超时的原因)
我看到 DataFlowTemplate.java 内部的 cmets 内容如下:
请注意,创建的 RestTemplate 将使用 JDK 的 默认超时值。 考虑传入一个自定义 {@link 休息模板}
问题那么,我究竟如何覆盖RestTemplate 中的Autowired 实例DataFlowClientAutoConfiguration??。
注意:我尝试在我的配置中使用public RestTemplate restTemplate(RestTemplateBuilder builder) bean 方法,但没有帮助。我尝试设置spring.main.allow-bean-definition-overriding=true。我还尝试将@Primary 用于我的RestTemplate bean 方法。最后,我尝试将sun.net.client.defaultConnectTimeout=300000 作为环境变量传递。似乎没有任何效果。我相信我已经用尽了所有我能想到的选项。
【问题讨论】:
标签: java spring-boot spring-cloud-dataflow spring-autoconfiguration