Насколько эффективен Spring АОП в случае потребления памяти

В моем проекте для домашних животных у меня есть работа, работающая в течение длительного времени, я хочу показать статус пользователю о процессе и как далеко он прошел. Так что я нажимаю объекты статуса на тему JMS, там собирает и загружает приложение WS, чтобы передать их действительному клиенту. Я написал пунктирные сокращения в spring AOP (а именно @Before, @AfterReturn) и вызывая мою службу для отправки сообщения в тему. Теперь я хочу зарегистрировать статус службы не в начале метода или после возврата внутри метода. Поэтому я вызвал службу (у которой jmsTamplete был введен и получил статус объекта). Есть ли способ минимизировать эти вызовы, чтобы я не мог повторять вызовы службы. вот мой код sudo.

public class Myservice{

UserDao userDao;
LegService legservice;
ProviderDao providerDao;
....
StatusServive statusServie;

//aop will call the same service to send info to JMS topic
fetchandCalculateLeg(){
    // here i called statusServie.senStatus(StatusObject);
    List<Users> = userDao.fetchUserInfo();
    // here i called statusServie.senStatus(StatusObject);
    ....
    loop: #forEachUser
    // here i called statusServie.senStatus(StatusObject);
    someList  = legservice.fecthLegInfoForEachUser();
    // here i called statusServie.senStatus(StatusObject);
    :endloop;
    ....
} }

В настоящее время у меня есть 3 задачи с длительным запуском, и я вызываю то же самое в каждом классе методов. Я хочу минимизировать вызовы.

EDIT1: Я также могу применить AOP к вызывающим методам, но какова производительность в этом случае? Как измерить производительность АОП (сколько памяти он потреблял во время приложения "Вверх" или "Создать прокси-объекты" ). Извините за задание стольких вопросов.

Ответ 1

Если вы используете производительность AOP, это будет лучше, чем это, так как это хорошо проверенная и оптимизированная структура для выполнения таких операций. В любом случае вы можете проверить, вычитая время начала и окончания.

Вы можете использовать свой текущий код и AOP-код для проверки производительности. Это была бы очень интересная работа. Сделайте что-то вроде ниже, чтобы установить время начала и окончания и вычесть.

System.currentTimeMillis()

Выше синтаксиса, Возвращает текущее время в миллисекундах. Обратите внимание, что хотя единица времени возвращаемого значения равна миллисекунде, степень детализации зависит от базовой операционной системы и может быть больше. Например, многие операционные системы измеряют время в единицах десятков миллисекунд. См. Описание класса Date для обсуждения небольших расхождений, которые могут возникнуть между "компьютерным временем" и скоординированным универсальным временем (UTC).

Существует много доступных возможностей Open Source Framework AOP.

  • Spring AOP: AOP с Spring Framework. Объявления. Одним из ключевых компонентов Spring Framework является инфраструктура Aspect oriented programming (AOP). Аспектно-ориентированное программирование влечет за собой разложение программной логики на отдельные части, называемые так называемыми проблемами.

  • AspectJ: AspectJ - это бесшовное аспектно-ориентированное расширение для языка программирования Java, совместимая с Java платформами и простая в освоении и использовании. AspectJ обеспечивает чистую модуляцию сквозных задач, таких как: проверка и обработка ошибок, синхронизация, контекстно-зависимое поведение, оптимизация производительности, мониторинг и ведение журнала, поддержка отладки, протоколы с несколькими объектами.

  • AspectWerkz: AspectWerkz - это динамичная, легкая и высокопроизводительная структура AOP для Java. AspectWerkz предлагает как мощь, так и простоту и поможет вам легко интегрировать АОП в новые и существующие проекты. AspectWerkz использует модификацию байт-кода во время выполнения, чтобы сплести ваши классы во время выполнения. Он перехватывает и перетаскивает классы, загружаемые любым загрузчиком классов, за исключением загрузчика класса загрузки. Он имеет богатую и высокоортогональную точку соединения. Аспекты, советы и интродукции написаны на простой Java, а ваши целевые классы могут быть регулярными POJO. У вас есть возможность добавлять, удалять и реструктурировать совет, а также заменять реализацию ваших представлений во время выполнения. Ваши аспекты могут быть определены с использованием файла определения XML или использования атрибутов времени выполнения.

РЕДАКТИРОВАТЬ 1

Spring также поддерживает AspectJ. Я проверил его с AspectJ 1.7.2, он не показывает утечку памяти. Вы можете реплицировать то же самое в своем приложении, создав много beans, после чего выгрузите кучу кучи через некоторое время, так как сбор мусора требует некоторого времени, когда это не мгновенно.

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

Простой пример доступен в MKYong: http://www.mkyong.com/spring3/spring-aop-aspectj-annotation-example/

ПРИМЕЧАНИЕ.. Вы должны изменить свой вопрос, измеряя время и пространство. И, согласно вашему комментарию, похоже, вы спрашиваете о большей оптимизации памяти или управлении. Кроме того, ваш вопрос зависит от вопроса.

Ответ 2

ЕСЛИ у вас такая долговременная работа, почему бы вам не поместить ее в Spring -Batch runtime? Внедрите пользовательский читатель → процессор → писатель, и система сделает все для вас. И чтобы показать подробности таких казней выполнения, я создал такой DTO https://gist.github.com/idyoshin/b035317db8c61b1b49ccb8898848171e и collector https://gist.github.com/idyoshin/74ad80841a51e1be62208f3fd58eeb6a. Эти утилиты работают, потому что я не хотел вставлять приложение Spring -batch admin в мое основное приложение. Я использую их для отображения деталей активного/архивного выполнения определенных заданий (на основе имен) моей системы.

Также, используя такие утилиты, вы можете реализовать пользовательский сборщик данных на основе таймеров, который будет толкать эти данные в JMS или Websocket. Spring -batch также имеет приятных слушателей, которые вы можете реализовать, например, пользовательский org.springframework.batch.core.ChunkListener позволит вам сделать "прогресс-бар", например, обновления - вы узнаете момент, когда ваш фрагмент был обработан, и, таким образом, обновить прогресс появился.

В отличие от вашего первоначального решения AOP подход с пакетом Spring будет прокручиваться вперед (чистый Java-код), а также будет решать вам дополнительную проблему: транзакции длительных больших обновлений: она сократит весь набор данных в куски и обрабатывать каждый фрагмент в одной транзакции.

Ответ 3

То, что вы просите, неясно, заголовок вопроса вводит в заблуждение.

Вы действительно можете использовать Spring Aop для задачи, которую хотите сделать, вам нужно только вводить вызовы журнала методами fetchUserInfo() и fecthLegInfoForEachUser() и тому подобное. Вы также можете использовать @Around для лучшего контроля.

Для стороны производительности, учитывая, что этот фрагмент кода очень ограничен, вы можете легко выполнить профилирование с помощью aop и без него. Имейте в виду, что AOP для ведения журнала очень широко используется, а Spring создает объекты прокси для многих объектов и целей, например, фабрик, поэтому он хорошо протестирован и работает.

Ответ 4

(1) Долгосрочные задачи означают "задания", поэтому вам может понадобиться: Quartz

(2) Если вам просто нужно знать, куда идет ваша программа, вам может понадобиться инструмент ведения журнала: Logback. четко определенный appender решит вашу проблему.