2016-07-06 4 views
0

공용 EJB 메소드에 대한 비동기 호출의 결과로 EJB 컨테이너의 스레드 풀에 의해 할당 된 다른 자식 스레드에 전달할 InheritableThreadLocal 변수가 있습니다. 비동기 호출을 시작하는 부모 호출자는 Stateless EJB 인 REST 리소스입니다. InheritableThreadLocal은 자식 스레드가 새로 생성 될 때만 자식 스레드에 값을 전달합니다. 스레드가 풀에 생성되면 서버가 반송 될 때까지 스레드를 파괴하지 않습니다.ThreadLocal 변수를 EJB 컨테이너에 전달 스레드 풀

위의 사실을 고려할 때, 내 사례의 하위 스레드는 EJB 컨테이너가 유지 관리하는 스레드 풀에서 비롯됩니다. 서버가 시작된 후 처음 Resource가 호출되거나 Threadpool에서 방금 생성 된 새로운 스레드가 자식 스레드로 할당 된 경우에만 InheritableThreadLocal 전달 값을 자식 스레드로 전달합니다. 다른 모든 경우에는 스레드가 생성되어 첫 번째 할당 된 때 풀에서 자식 스레드에 할당 된 초기 값을 얻고 있습니다.

IBM WebSphere에서 코드를 실행하고 비동기 호출의 메소드 매개 변수로 ThreadLocal 값을 전달하는 것이 옵션이 아닙니다.

각 실행에 대해 하위 스레드에 할당 된 현재 값을 얻을 수 있도록 ThreadLocal 값을 다시 할당 할 수 있습니까?

아래 링크는 다소 비슷하지만 ThreadPool은 EJB 컨테이너에서 제공 한 것입니다.

Propagating ThreadLocal to a new Thread fetched from a ExecutorService

+0

답을 얻지 못하면 일부 코드 단편을 추가하여 사람들이 올바르게 읽는지 확인하는 것이 좋습니다. –

답변

0

ThreadLocal를 사용하여 이식 가능한 방법이 아니다. 컨테이너가 스레드를 처리하는 방법을 정확히 알아야합니다.

내 관점에서 볼 때 ThreadLocal은 일반적으로 컨테이너가 동일한 스레드를 사용하여 Servler/REST/EJB 호출 동기화 순서를 처리하므로 저장하지 않습니다. 비동기가 재생되면 작동하지 않습니다.

필자는 매개 변수 나 지속성과 같은 이식 가능한 방법을 사용했습니다.