消息处理程序中的SpEL导致CPU过高

时间:2017-05-24 14:27:39

标签: spring-integration

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

流程中有大约12个ServiceActivators,定义如下:

<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)

分析截图: Profiling screenshot

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

1 个答案:

答案 0 :(得分:2)

提取标题有点贵;传递消息并且还有框架提取头文件有点不寻常。由于您拥有整条消息,因此您可以通过这种方式访问​​标题。

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

-Dspring.expression.compiler.mode=MIXED

但是,这需要Spring Framework 4.3.7或更高版本(this fix is needed)或Spring Integration 4.3.8或更高版本(which has this workaround

在5.0中,我们尽可能避免使用SpEL,并且相同的测试在大约400ms内运行。