Могут ли pointcuts быть динамически ориентированными на потоки?
Я хочу отслеживать все мои публичные вызовы методов при определенных условиях. Но я хочу, чтобы это отслеживание как можно меньше сказывалось на производительности всей системы.
Мне нужен способ, как динамически "включать" pointcut для выполнения только для указанного потока, и это включение (и выключение) должно быть динамически вызываться из моего кода.
Т.е., если мой Java-код обнаружит, что что-то произошло, он включит pointcut для своего собственного потока. Этот pointcut будет регистрировать все открытые вызовы методов, и через некоторое время (или через некоторое количество перехватов) pointcut отключится.
Конечно, я мог бы вызвать код в совете, например "...getCurrentThread(). Equals(myMonitoringThread) && MonitoringEnabled", но это означало бы, что совет будет выполняться для всех открытых методов всех потоков и всегда выполнять этот код, который безусловно, повредит производительности всего приложения.
То, что я хотел бы иметь, это изоляция производительности только для выбранного потока на включенное время и оставление остальных потоков без изменений.
Кто-нибудь знает о технике, как это сделать?
Спасибо томас
1 ответ
Когда вы используете аспекты, это влияет на ваши классы: байт-код изменяется для соответствия аспектам (или в случае Spring ваши вызовы проксируются с помощью выделенного класса, совместимого с аспектами).
В случае AspectJ это может быть сделано во время компиляции, сразу после компиляции или во время загрузки (посмотрите здесь). Инструментированные классы зависят от того, как определяются ваши аспекты (например, перехватывать все общедоступные методы), и это означает, что они не могут быть реально затронуты во время выполнения (даже если я совершенно уверен, что сумасшедший кодер может изобрести загрузку / выгрузку). классный механизм, чтобы справиться с этим, но это было бы безумием;).
Поэтому, чтобы ответить на ваш вопрос, я думаю, что вы не можете полностью подключить / отключить ваши аспекты во время выполнения простым способом (если это только возможно!).