簡體   English   中英

結合@Scheduled 和@Configurable 放慢速度

[英]Slow down with combining @Scheduled and @Configurable

我們只是將我們對 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,有沒有辦法禁用它?

我剛剛測試了它

<task:annotation-driven mode="aspectj" executor="myExecutor" scheduler="myScheduler" />
<task:executor id="myExecutor"  pool-size="1" />
<task:scheduler id="myScheduler" />

現在由於 Aspectj 模式,它運行得更快。 Eclipse 顯示模式屬性錯誤。 我不知道為什么。 但它有效。 與 mode="proxy" 一起使用的 AOPUtils.canApply() 似乎太慢了。

更新:在查找 @Scheduled 注釋時仍有 80% 的可配置運行時,見圖:在此處輸入圖像描述

因此,如果您使用@configurable,請注意有額外的開銷。 對於每個新實例,檢查此 class 是否具有使用 @Scheduled 注釋的方法。 因為在同一個 class 上擁有 @Configurable 和 @scheduled 是相當奇怪的,所以我認為搜索 @Scheduled 注釋應該只在應用程序上下文啟動時完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM