spring-boot - 带有 @Restcontoller 计时问题的 Spring 集成流程
问题描述
一个简单的@RestController 通过@MessagingGateway 连接到一个IntegrationFlow。在负载测试之后,我们在跟踪中看到我们甚至在流中开始处理之前就损失了“很多时间”: 跟踪结果 在这个示例中,我们可以看到在将消息发送到流之前花费了超过 90 毫秒。有没有人知道是什么导致了这种行为?据我了解文档,一切都在发送者线程中处理,因此没有创建特殊的工作线程。我们使用 Restcontroller 因为我们需要使用 springdoc-openapi-ui 创建文档
示例代码:
休息控制器
@RestController
public class DescriptionEndpoint {
HttpMessageGateway httpMessageGateway;
public Result findData(@Valid dataRequest dataRequest) {
final Map<String, Object> headerParams = new HashMap<>();
return httpMessageGateway.basicDataDescriptionFlow(dataRequest, headerParams);
}
}
网关
@MessagingGateway
public interface HttpMessageGateway {
@Gateway(requestChannel = "startDataFlow.input")
Result basicDataDescriptionFlow(@Payload dataRequest prDataRequest, @Headers Map<String, Object> map);
}
集成流
public class ExampleFlow {
@Bean
public IntegrationFlow startDataFlow() {
return new FlowExtension()
.handle(someHandler1)
.handle(someHandler2)
.handle(someHandler3)
.get();
}
}
解决方案
添加更多跟踪后,我意识到这个时间问题是由我的 spring 安全配置引起的。不幸的是,我想,跨度只代表 findData(..) 开始后的时间。但似乎,跟踪已经在代理方法和安全链中开始了。
在改进了我们的 JWTToken 过滤器的一些实现之后,这些端点的花费时间是可以的。
推荐阅读
- kotlin - 如何在 Kotlin 中使用泛型定义功能接口?
- mysql - Selenium python脚本工作但它没有点击或输入任何值firefox
- apache-spark - 为什么要在一个执行程序中对所有数据进行分区?
- javascript - JQuery 不会更新按钮上的微调器
- javascript - 如何交换项目而不是添加到同一个容器中?
- python - 通过 API 修改 Gmail 标签的权限不足
- php - 创建 Laravel 外键的 SQL 错误代码 1064
- c++ - 不能为命名空间中的私有枚举重载 i/o 运算符
- google-sheets - 如何将工作流程计划中的数据重新组织为另一种格式,从一种 Google 表格到另一种
- javascript - 如何在 JavaScript 中浅拷贝 Set?