在我们的应用程序上运行高负载时,我们会遇到极高的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)
如何避免这种表达评估?应用程序在SprintBoot和SpringIntegration 4.3.x上运行
答案 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内运行。