powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как с помощью интерцептора высчитать время выполнения методов?
13 сообщений из 13, страница 1 из 1
Как с помощью интерцептора высчитать время выполнения методов?
    #39027368
alex2808
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Подскажите, может кто-то делал подобные задачи?

Пытаюсь понять как с помощью интерцепторов EJB или CDI можно посчитать время выполнения методов, т.е. включить логгирование.
Не могу врубиться в логику работы интерцептора, а именно как мне их запустить после выполнения метода.

Например создам интерцептор:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@Interceptor
public class SaveInterval {
@AroundInvoke
public Object beginTime(InvocationContext ctx) throws Exception {
long startTime = System.currentTimeMillis();
ctx.getContextData().put(“startTime”, startTime); //сохраняю в контекст время начала 
return ctx.proceed();
}
}



Ну и бин на который хочу натравить интерцептор:
Код: java
1.
2.
3.
@Stateless
@Interceptors(SaveInterval.class)
public class OrderBean { ... }



Подскажите, как должен быть написан интерцептор, который я хочу натравить на тот же бин, но он должен запускаться в конце вызова любого из методов класса OrderBean, брать из InvocationContext "startTime", который туда положил метод beginTime
Код: java
1.
 invocationContext.getContextData().get(“startTime”);


и вычислять разность времени?
...
Рейтинг: 0 / 0
Как с помощью интерцептора высчитать время выполнения методов?
    #39027384
base2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex2808, например так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
@Interceptor
public class SaveInterval {
    @AroundInvoke
    public Object beginTime(InvocationContext ctx) throws Exception {
        long startTime = System.currentTimeMillis();
        try {
            return ctx.proceed();
        } finally {
            long endTime = System.currentTimeMillis();
            System.out.println(endTime - startTime);
        }
    }
}
...
Рейтинг: 0 / 0
Как с помощью интерцептора высчитать время выполнения методов?
    #39027402
alex2808
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
base2alex2808, например так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
@Interceptor
public class SaveInterval {
    @AroundInvoke
    public Object beginTime(InvocationContext ctx) throws Exception {
        long startTime = System.currentTimeMillis();
        try {
            return ctx.proceed();
        } finally {
            long endTime = System.currentTimeMillis();
            System.out.println(endTime - startTime);
        }
    }
}



Т.е. ctx.proceed() запускает выполнения тела метода?
И после return из метода, курсор выполнения опять возвращается в интерцептор, соответственно давая возможность выполнить все что ниже ctx.proceed()?
...
Рейтинг: 0 / 0
Как с помощью интерцептора высчитать время выполнения методов?
    #39027406
base2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex2808Т.е. ctx.proceed() запускает выполнения тела метода?

да

alex2808И после return из метода, курсор выполнения опять возвращается в интерцептор, соответственно давая возможность выполнить все что ниже ctx.proceed()?
В том примере, что привел я, только в том случае, если proceed в блоке try, а "всё что ниже" в блоке finally.
Но можно еще так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@Interceptor
public class SaveInterval {
    @AroundInvoke
    public Object beginTime(InvocationContext ctx) throws Exception {
        long startTime = System.currentTimeMillis();
        Object result = ctx.proceed();
        long endTime = System.currentTimeMillis();
        System.out.println(endTime - startTime);
        return result;
    }
}
...
Рейтинг: 0 / 0
Как с помощью интерцептора высчитать время выполнения методов?
    #39027409
base2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
base2, но в последнем примере, в случае, если proceed() кинет exception, то время не залогируется
...
Рейтинг: 0 / 0
Как с помощью интерцептора высчитать время выполнения методов?
    #39027606
alex2808
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!
Теперь все сложилось в стройную картинку!
:)
...
Рейтинг: 0 / 0
Как с помощью интерцептора высчитать время выполнения методов?
    #39027666
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я-бы вёл еще и учёт количества вызовов ctx.proceed().
...
Рейтинг: 0 / 0
Как с помощью интерцептора высчитать время выполнения методов?
    #39027817
alex2808
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ-бы вёл еще и учёт количества вызовов ctx.proceed().
В смысле собирать статистику вызовов метода?

Или учет вызовов ctx.proceed() в одном интерцепторе?
...
Рейтинг: 0 / 0
Как с помощью интерцептора высчитать время выполнения методов?
    #39028049
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оценку влияния cumulative elapsed time на проект можно получить как произведения callbacks * elapsedtime.
Тоесть если твой метод работал 1 мс но триллион раз то его влияние на нагрузку сильнее чем у метода
который работал 1 секунду но вызывался миллион раз.

Как-то так вобщем-то.
...
Рейтинг: 0 / 0
Как с помощью интерцептора высчитать время выполнения методов?
    #39028051
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчёт деталей реализации. Интерсепторы там или опции компиллятора или профилирование - это уж
ты сам решай.
...
Рейтинг: 0 / 0
Как с помощью интерцептора высчитать время выполнения методов?
    #39028103
alex2808
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понял. Спасибо!
...
Рейтинг: 0 / 0
Как с помощью интерцептора высчитать время выполнения методов?
    #39028916
alex2808
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А подскажите, если код уже существует и нет доступа к нему,
есть ли возможность создавать интерцепторы и подключить их не через аннотации к уже существующему коду?
...
Рейтинг: 0 / 0
Как с помощью интерцептора высчитать время выполнения методов?
    #39029024
base2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex2808, по крайней мере спринг позволяет. http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-schema
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как с помощью интерцептора высчитать время выполнения методов?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]