2016-12-14 2 views
0

현재 큰 문제가 발생하고 도움을 주시면 감사하겠습니다.용접 : 스레드 J2EE 내부에 종속성 삽입

우선 J2EE 환경에서 다음과 같은 문제가 발생합니다. 스레드를 직접 관리해서는 안되지만 불행히도 EJB를 변경하거나 사용할 수는 없습니다. 환경은 Tomcat 웹 컨테이너 및 Weld CDI 관리자를 기반으로합니다.

내 구조에는 RESTful 서비스, 서비스 레이어 및 DAO 레이어 구현이 많이 포함되어 있으며 이들 모두는 @ 삽입을 사용하여 서로 주입되고 있으며 정상적으로 작동합니다. 내 서비스 층 내 실행 방법에 주입하는 데 필요한 때 문제는 온다 나는

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는 그대로 스레드 간 컨텍스트 전파를 지원하지 않습니다. 하나의 스레드에만 바인딩됩니다. 그렇지 않으면 동기화로 인해 심각한 오버 헤드가 발생합니다. 주어진 상황에서 콩의 저장으로 사용 ThreadLocal<BeanStore>가있는 곳에 위 내 쓰레드 범위의 주장의 증거로

Weld source code 봐. 링크에서 참조하는 클래스는 클래스를 구현하는 컨텍스트의 전신입니다. 또한 이것이 용접 전용 "문제"가 아니라는 점에 유의하십시오. CDI는 동일한 원리로 작동합니다.

다른 스레드에서 주어진 컨텍스트/범위를 활성화 할 수 있지만 모든 것이 새로 만들어지고 예를 들어 @ApplicationScoped 빈에 저장 한 상태가 전파되지 않습니다. 또한 좋은 해킹이 아닌 경우 이 빈 저장소에 액세스하여 다른 스레드에 사본을 만들 수 있습니다. 그게 당신에게 읽기 전용 액세스를 제공 할 것이지만 나는 그 일을하는 방법과 그 노력의 가치가 있는지조차 모르겠습니다.

CDI를 사용하면 자신 만의 컨텍스트를 구현하거나 기본 제공 컨텍스트 버전을 보완 할 수 있습니다. 그렇게하면 스레드 전반에서 작업하는 컨텍스트의 본격 버전을 제공 할 수 있지만 그렇게 많은 도전 과제가있어 실현 가능/합리적이라고 확신하지 못합니다.

+0

답변 해 주셔서 감사합니다. 나는 동의해야합니다, 나는 당신이 말한 것처럼 할 노력이 가치가 있다고 생각하지 않습니다. 내 상황에 대한 해결책을 찾아 스레드 사용을 제거해야 할 것입니다. – luanlucas