消息处理程序中的 SpEL 导致 CPU 使用率较高

问题描述 投票:0回答:1

当我们的应用程序运行高负载时,我们会遇到极高的 CPU(15 个内核,100%)。配置文件显示 SpEL 使用了 20% 以上,其中主要由 ServiceActivatingHandler 使用。该应用程序使用服务激活器来处理消息,但从不使用任何 SpEL。

一个流程中大约有12个ServiceActivator,其定义如下:

<service-activator ref="myService"/>
或者
<service-activator ref="myService" method="addStuff"/>

大部分签名如下:

@ServiceActivator public Message<String> handle(Message<String>, @Header("header1") String header1, @Header("header2") String header2, @Header("header3") String header3)

分析截图:

如何避免这种表达式求值?应用程序在 SprintBoot 和 SpringIntegration 4.3.x 上运行

spring-integration
1个回答
2
投票

提取标头有点昂贵;传递消息并让框架提取标头有点不寻常。由于您拥有完整的消息,因此您可以通过这种方式访问标头。

您可以编译 SpEL,速度要快得多;在我的测试中,它从 8000 毫秒(100,000 次调用)下降到 137 毫秒。

-Dspring.expression.compiler.mode=MIXED

但是,这需要 Spring Framework 4.3.7 或更高版本(需要此修复)或 Spring Integration 4.3.8 或更高版本(有此解决方法

在 5.0 中,我们尽可能避免 SpEL,并且相同的测试运行时间约为 400 毫秒。

© www.soinside.com 2019 - 2024. All rights reserved.