Замедляйте, комбинируя @Scheduled и @Configurable. - PullRequest
3 голосов
/ 18 июля 2011

мы просто перемещаем наше определение заданий cron из определений на основе xml в аннотации, управляемые

<task:annotation-driven />

мы не настроили его дальше, так как по умолчанию все в порядке. У нас есть несколько запланированных аннотаций. Все работало нормально При его развертывании мы увидели значительное сокращение времени отклика с среднего времени отклика примерно 20-30 мс до среднего времени отклика 40-60.

После того, как мы просто закомментировали однострочник выше среднего времени отклика, мы снова опустились до обычных значений.

Мы проверили, что происходит. Мы также используем @Configurable. мы обнаружили, что

AsyncAnnotationBeanPostProcessor.postProcessAfterInitialization(...)

вызывается каждый раз, когда создается экземпляр компонента @Configurable, и это занимает 15% времени выполнения.

Кроме того, ScheduledAnnotationBeanPostProcessor вызывается каждый раз, но это занимало почти 0% нашего времени выполнения, потому что этот метод выполняет только

AnnotationUtils.getAnnotation(method, Scheduled.class);

Дополнительные затраты времени выполнения вместе с @Configurable делают его непригодным для нас.

  1. Почему AsyncAnnotationBeanPostProcessor делает намного больше, чем ScheduledAnnotationBeanPostProcessor?

  2. Поскольку мы не используем @Async в данный момент, есть ли способ отключить его?

1 Ответ

2 голосов
/ 18 июля 2011

Я только что протестировал его с

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

, теперь он работает быстрее из-за режима Aspectj.Затмение показывает мне ошибку для атрибута режима.Я не знаю почему.Но это работает.Похоже, что AOPUtils.canApply () работает слишком медленно, что используется с mode = "proxy".

Обновление: у меня все еще есть 80% настраиваемой среды выполнения при поиске аннотаций @Scheduled, смотрите рисунок: enter image description here

Так что, если вы используете @configurable, помните, что есть дополнительные издержки.для каждого нового экземпляра проверяется, есть ли в этом классе методы, помеченные @Scheduled.Поскольку довольно странно иметь @Configurable и @scheduled в одном классе, я думаю, что поиск аннотаций @Scheduled следует выполнять только при запуске контекста приложения.

...