У меня есть журнал, в котором я регистрирую, как долго вызовы базы данных и вызовы метода 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-методе уничтожается, когда метод завершается? Что я могу использовать для достижения своей цели?
Я думаю, что использую перехватчики EJB. У меня есть @Interceptors ({Class.class}, аннотированный на уровне класса, и импорт выглядит так: import javax.interceptor.AroundInvoke; import javax.interceptor.InvocationContext; – user1608137
Я был уверен, что это было в спецификации EJB, но я не может найти его сейчас. Возможно, существует расхождение между реализациями. Я тестировал на WebSphere Application Server и вызывал перехватчики в потоке async. Возможно, попробуйте выполнить печать Thread.currentThread(). toString/.getId/.getName из перехватчика и асинхронный метод для подтверждения поведения Glassfish? –
Перехватчики корректно выполняются для методов Async. Они вызывают LoggingBean после invocation.proceed() и добавляют время, затрачиваемое на разговор с базой данных в loggingbean ... eg invocation.proceed(); loggingbean.addDBTime (System.c urrentMillis() - начало); все, что работает правильно, но когда конечный перехватчик (на уровне трикотажа) вызывает метод loggingbean.log(), время db равно 0. Я проверил, что перехватчик db регистрирует не 0 раз – user1608137