JAX-WS Monitor Использование и производительность WebMethod - PullRequest
0 голосов
/ 16 февраля 2019

Я создаю WebService с аутентификацией на основе токенов, токен извлекается из мыльных заголовков.Я хочу отслеживать / профилировать каждый WebMethod, я хочу знать, какой пользователь вызвал какой WebMethod и сколько времени потребовалось для его обработки.Я не могу использовать внешние инструменты мониторинга, потому что мне все еще нужно извлечь токен, поэтому я знаю, какой пользователь фактически вызвал этот WebMethod.

Сейчас я использую простой класс WebFilter, который вызывается перед каждым WebMethod вручную и выдает исключение, еслиУ пользователя нет прав для вызова этого метода.Но добавление что-то вроде long start = System.currentMillis(); перед каждым методом и после вычисления времени не является решением, так как у меня будут сотни методов.

@WebService (serviceName = "UserService")
public class UserService implements IUserService {

@Resource
WebServiceContext wsctx;

@WebMethod
@Override
public User getUser(@WebParam(name = "name") String name) throws ServiceException {
    WebFilter.filter(wsctx.getMessageContext());
    return userManager.getUser(name);
}

Я ищу что-то вроде решения Interceptors, мне нужно вызвать что-топеред каждым WebMethod и после него, но перехватчики на самом деле не работают с WebMethods, поэтому я немного отчаялся по этому поводу.

1 Ответ

0 голосов
/ 16 февраля 2019

Решено с аннотацией перед каждым отслеживаемым классом:

@Interceptors({PerformanceInterceptor.class})

И это внедрение перехватчика:

@AroundInvoke
public Object methodInterceptor(InvocationContext ctx) throws Exception {
   long start = System.currentTimeMillis();
   try {
       return ctx.proceed();
   } finally {
       long end = System.currentTimeMillis();
       System.out.println(ctx.getMethod().getName() + " took: " + (end - start) + "ms");
   }
}
...