我们只是将cron作业的定义从基于xml的定义移动到使用
驱动的注释<task:annotation-driven />
我们没有进一步配置,因为默认设置很好。 我们有一些@Scheduled注释。一切都很好。当我们部署它时,我们看到响应时间大幅下降,从大约20-30毫秒的平均响应时间到40-60平均响应时间。
在我们的响应时间之后评论出单行时,平均值再次降至正常值。
我们检查了发生了什么。我们也在使用@Configurable。我们发现了
AsyncAnnotationBeanPostProcessor.postProcessAfterInitialization(...)
每次实例化@Configurable bean时都会调用,并且执行时间占用了15%。
此外,每次调用ScheduledAnnotationBeanPostProcessor,但它占用了我们执行时间的近0%,因为此方法仅执行
AnnotationUtils.getAnnotation(method, Scheduled.class);
额外的运行时开销和@Configurable使我们无法使用它。
为什么AsyncAnnotationBeanPostProcessor比ScheduledAnnotationBeanPostProcessor做得更多?
由于我们现在没有@Async,有没有办法禁用它?
答案 0 :(得分:2)
我刚用
测试了它<task:annotation-driven mode="aspectj" executor="myExecutor" scheduler="myScheduler" />
<task:executor id="myExecutor" pool-size="1" />
<task:scheduler id="myScheduler" />
现在因为Aspectj模式而运行得更快。 Eclipse向我显示mode属性的错误。我不知道为什么。但它的确有效。似乎AOPUtils.canApply()太慢,与mode =“proxy”一起使用。
更新: 在查找@Scheduled注释时仍有80%的可配置运行时,请参见图片:
因此,如果您使用@configurable,请注意有额外的开销。对于每个新实例,检查此类是否具有使用@Scheduled注释的方法。因为在同一个类上使用@Configurable和@scheduled是相当奇怪的,我认为只能在应用程序上下文启动时搜索@Scheduled注释。