2013-03-13 1 views
0

У меня есть журнал, в котором я регистрирую, как долго вызовы базы данных и вызовы метода bean принимают через перехватчики.RequestScoped Logging bean с асинхронными вызовами

У меня есть компонент, который вызывает два метода @Asynchronous. Эти два @Asynchronous методы вызывают базу данных и перехватываются.

Когда журнал регистрации регистрируется, кажется, что база данных заняла 0 мс, что не может быть прав. Когда я использую этот журнал и все перехватчики без @Асинхронных звонков, все работает нормально.

Я использую глазурь 3.1.2.2. В документе doc http://glassfish.java.net/nonav/docs/v3/api/javax/enterprise/context/RequestScoped.html говорится: «Контекст запроса уничтожен: после завершения асинхронного уведомления наблюдателя:« Означает ли это, что мой экземпляр компонента ведения журнала в @Asynchronous-методе уничтожается, когда метод завершается? Что я могу использовать для достижения своей цели?

ответ

0

Есть несколько слоев:

  1. CDI прокси, который работает CDI перехватчики, а затем вызывает EJB.
  2. Прокси-сервер EJB, который планирует работу async и немедленно возвращается.
  3. EJB-перехватчики, которые работают на асинхронной нити.

Предположительно, вы используете перехватчик CDI, который измеряет время, необходимое для контейнера EJB для графика Асинхронной работой. Если вместо этого вы переключаетесь на использование перехватчика EJB (т. Е. Аннотируете метод EJB с помощью @Interceptors), то вы можете измерить время, затраченное на , выполнить работу.

+0

Я думаю, что использую перехватчики EJB. У меня есть @Interceptors ({Class.class}, аннотированный на уровне класса, и импорт выглядит так: import javax.interceptor.AroundInvoke; import javax.interceptor.InvocationContext; – user1608137

+0

Я был уверен, что это было в спецификации EJB, но я не может найти его сейчас. Возможно, существует расхождение между реализациями. Я тестировал на WebSphere Application Server и вызывал перехватчики в потоке async. Возможно, попробуйте выполнить печать Thread.currentThread(). toString/.getId/.getName из перехватчика и асинхронный метод для подтверждения поведения Glassfish? –

+0

Перехватчики корректно выполняются для методов Async. Они вызывают LoggingBean после invocation.proceed() и добавляют время, затрачиваемое на разговор с базой данных в loggingbean ... eg invocation.proceed(); loggingbean.addDBTime (System.c urrentMillis() - начало); все, что работает правильно, но когда конечный перехватчик (на уровне трикотажа) вызывает метод loggingbean.log(), время db равно 0. Я проверил, что перехватчик db регистрирует не 0 раз – user1608137

 Смежные вопросы

  • Нет связанных вопросов^_^