Spring Cloud 数据流 - 休息客户端 - 覆盖 RestTemplate
Posted
技术标签:
【中文标题】Spring Cloud 数据流 - 休息客户端 - 覆盖 RestTemplate【英文标题】:Spring Cloud Data Flow - Rest Client - Override RestTemplate 【发布时间】: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
作为环境变量传递。似乎没有任何效果。我相信我已经用尽了所有我能想到的选项。
【问题讨论】:
【参考方案1】:我也有同样的情况。我认为这是一个设计缺陷。首先,因为它可以在不注意的情况下向应用程序的主要用途 restTemplate 添加副作用(即身份验证)。此外,可能内部 dataFlowOperations() 应该将所有依赖项作为参数包含在签名中,因此我们可以通过执行类似的操作来引入行为而无需复制所有代码
@Bean
public DataFlowOperations dataFlowOperations()
return dataFlowClientAutoConfiguration.dataFlowOperations(myCustomRestTemplate(),..);
另一种选择是自动配置中的所有依赖项都是通过构造函数注入的,所以我们可以这样做
@Bean
public DataflowOperations dataflowOperations()
return new DataFlowClientAutoConfiguration(restTemplate,...).dataFlowOperations
我认为现在满足我们需求的唯一方法是在本地复制所有 DataFlowOperations autconfiguration,使用反射(我完全固执地批准),或者将特定 dataflowClientRestTemplate 的整个架构更改为 @Primary
【讨论】:
以上是关于Spring Cloud 数据流 - 休息客户端 - 覆盖 RestTemplate的主要内容,如果未能解决你的问题,请参考以下文章
如何从Postman休息客户端发送spring csrf令牌?