2016-12-14 3 views
0

В настоящее время я вхожу в огромную проблему, и любая помощь будет высоко оценена.Weld: Inject dependency inside Thread J2EE

Прежде всего, в среде J2EE происходит следующее: я не должен сам управлять нитью, но, к сожалению, я не могу это изменить и не использовать EJB. Окружающая среда основана на менеджеру контейнера Tomcat Web Container и Weld CDI.

В моей структуре содержится множество сервисов RESTful, уровня Service layer и DAO, и все они получают друг друга с помощью @Inject, и он отлично работает. Проблема возникает, когда мне нужно, чтобы получить мой слой Service впрыскивается в мой метод Run и я получаю

WELD-001303 No active contexts for scope type javax.enterprise.context.RequestScoped. 

У меня уже есть метод, чтобы вернуть нужный компонент с контекстным, так как следующий код описывает:

BeanManager manager = (BeanManager) jndiContext.lookup("java:/comp/BeanManager"); 
Bean<T> bean = (Bean<T>) manager.getBeans(beanClass).iterator().next(); 
CreationalContext<?> ctx = manager.createCreationalContext(bean); 

return (T) manager.getReference(bean, beanClass, ctx); 

Но даже я использую этот метод, я получаю ошибку. Итак, есть ли способ, которым я мог бы вставлять свои бобы в поток, созданный и управляемый мной?

спасибо.

ответ

0

Извините, но нет, это просто не сработает.

CDI, как есть, не поддерживает распространение контекста по потокам. Он связан только с одним потоком. В противном случае это может привести к серьезным издержкам из-за синхронизации.

В качестве доказательства моего требования, касающегося нитей, приведенного выше, посмотрите на Weld source code, где есть ThreadLocal<BeanStore>, используемый в качестве хранилища для бобов в данном контексте. Класс, о котором я упоминаю в ссылке, является предшественником контекстных классов. Также обратите внимание, что это не проблема «только для сварки», любой CDI-интерфейс там работает на той же основе.

Вы можете активировать данный контекст/область действия в другом потоке, но это означает, что все будет создано заново, и любое состояние, которое вы сохранили в своем (например) @ApplicationScoped bean, не будет распространяться. Кроме того, с некоторыми определенно не приятно взломать, вы можете получить , чтобы получить доступ к хранилищу bean и сделать копию в другой теме. Это даст вам доступ только для чтения, но я не уверен, как это сделать, и если это даже стоит усилий.

И последнее, но не менее важное: CDI позволяет вам реализовать собственный контекст или даже добавить свою версию встроенных контекстов. Таким образом, вы сможете обеспечить полномасштабную версию контекста, работающую по потокам, но есть так много проблем, что я не уверен, что это выполнимо/разумно.

+0

Благодарим вас за ответ. Я должен согласиться, я не думаю, что это стоит усилий, как вы сказали. Я, вероятно, должен найти обходное решение для моей ситуации и удалить использование Thread. – luanlucas

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

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