2016-02-16 1 views
1

Я пытаюсь выполнить время выполнения журнала с помощью перехватчика.Область запроса Java EE и асинхронная

@LogPerformance 
@Interceptor 
public class PerformanceInterceptor { 

Время хранится в бланке с запросом. По завершении запроса время записывается в файл журнала.

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

@Asynchronous 
@LogPerformance 
public Future<String> getString() { 

Я считаю, что новый поток EJB определяет новую область запроса. Я могу регистрировать вывод из перехватчика и видеть объект с областью запроса, но есть два разных адреса, прикрепленных к объектам. Один адрес для потока HTTP и другой адрес для потока EJB.

Есть ли способ разрешить перехватчикам от асинхронных методов писать объект в области запроса HTTP? Есть ли другой способ вернуть данные в родительскую область?

ответ

1

Контейнер будет распространять javax.ejb.EJBContext на поток, который выполняет асинхронный метод.

Вы можете вставить этот EJBContext в свой перехватчик и спрятать любое состояние (например, ваш бланк с запросом), который вы хотите в него через javax.ejb.EJBContext.getContextData().

+0

Я попытался вставить EJBContext в перехватчик (как @Resource, так и @Inject). Он не работает при запуске контейнера (отсутствует зависимость). Я считаю, что причиной является перехватчик - это CDI Bean и поэтому не имеет связанного с ним EJBContext. – jake

+0

Я ожидал бы, что жизненный цикл перехватчика, объявленного по методу EJB, будет контролироваться контейнером EJB. –

+0

Можете ли вы включить фрагмент кода, показывающий, как именно вы это сделали. Я не смог получить доступ к сохраненным значениям contextData из @Asynchronous метода с помощью Payara, Wildfly, TomEE и профиля Websphere Liberty. (Даже без использования перехватчика) – bastian