结合@Scheduled和@Configurable减慢速度

时间:2011-07-18 07:33:59

标签: java spring annotations scheduled-tasks

我们只是将cron作业的定义从基于xml的定义移动到使用

驱动的注释
<task:annotation-driven />

我们没有进一步配置,因为默认设置很好。 我们有一些@Scheduled注释。一切都很好。当我们部署它时,我们看到响应时间大幅下降,从大约20-30毫秒的平均响应时间到40-60平均响应时间。

在我们的响应时间之后评论出单行时,平均值再次降至正常值。

我们检查了发生了什么。我们也在使用@Configurable。我们发现了

AsyncAnnotationBeanPostProcessor.postProcessAfterInitialization(...)
每次实例化@Configurable bean时都会调用

,并且执行时间占用了15%。

此外,每次调用ScheduledAnnotationBeanPostProcessor,但它占用了我们执行时间的近0%,因为此方法仅执行

AnnotationUtils.getAnnotation(method, Scheduled.class);

额外的运行时开销和@Configurable使我们无法使用它。

  1. 为什么AsyncAnnotationBeanPostProcessor比ScheduledAnnotationBeanPostProcessor做得更多?

  2. 由于我们现在没有@Async,有没有办法禁用它?

1 个答案:

答案 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%的可配置运行时,请参见图片: enter image description here

因此,如果您使用@configurable,请注意有额外的开销。对于每个新实例,检查此类是否具有使用@Scheduled注释的方法。因为在同一个类上使用@Configurable和@scheduled是相当奇怪的,我认为只能在应用程序上下文启动时搜索@Scheduled注释。