Java EE 컨테이너의 스폰 스레드가 권장되지 않는 이유는 무엇입니까?
Java EE 개발에 대해 처음 배운 것 중 하나는 Java EE 컨테이너 내부에 자체 스레드를 생성하지 않아야한다는 것입니다. 그러나 내가 그것에 대해 생각할 때, 나는 이유를 모른다.
낙심 한 이유를 명확하게 설명 할 수 있습니까?
대부분의 엔터프라이즈 응용 프로그램에는 메일 데몬, 유휴 세션, 정리 작업 등과 같은 일종의 비동기 작업이 필요합니다.
따라서 실제로 스레드를 생성하지 않아야하는 경우 필요할 때 스레드를 올바르게 처리하는 방법은 무엇입니까?
환경 내의 모든 리소스가 서버에 의해 관리되고 잠재적으로 모니터링되어야하므로 권장하지 않습니다. 또한 스레드가 사용되는 컨텍스트의 대부분은 일반적으로 실행 스레드 자체에 연결됩니다. 자신의 스레드를 시작하면 (일부 서버는 허용하지 않는다고 생각) 다른 리소스에 액세스 할 수 없습니다. 이것은 InitialContext를 얻을 수없고 JMS 연결 팩토리 및 데이터 소스와 같은 다른 시스템 자원에 액세스하기 위해 JNDI 조회를 수행 할 수 없다는 것을 의미합니다.
이를 "올바르게"수행하는 방법이 있지만 사용중인 플랫폼에 따라 다릅니다.
commonj WorkManager는 WebSphere 및 WebLogic뿐만 아니라 다른 사람들에게도 공통입니다.
오늘 아침부터 이걸 약간 복제 합니다
업데이트 :이 질문과 답변은 2009 년 Java EE 상태와 관련이 있으며 그 이후로 상황이 개선되었습니다!
EJB의 경우 권장하지 않을뿐만 아니라 사양 에서 명시 적으로 금지되어 있습니다 .
엔터프라이즈 Bean은 스레드 동기화 기본 요소를 사용하여 여러 인스턴스의 실행을 동기화하지 않아야합니다.
과
엔터프라이즈 Bean은 스레드 관리를 시도해서는 안됩니다. 엔터프라이즈 Bean은 스레드를 시작, 중지, 일시 중단 또는 재개하거나 스레드의 우선 순위 또는 이름을 변경하려고 시도해서는 안됩니다. 엔터프라이즈 Bean은 스레드 그룹 관리를 시도하지 않아야합니다.
그 이유는 EJB가 분산 환경에서 작동하기 때문입니다. EJB는 클러스터의 한 시스템에서 다른 시스템으로 이동할 수 있습니다. 스레드 (및 소켓 및 기타 제한된 기능)는이 이식성에 중요한 장벽입니다.
자신의 스레드를 생성하지 않아야하는 이유는 컨테이너가 스레드를 관리하지 않기 때문입니다. 컨테이너는 초보자 개발자가 상상하기 어려운 많은 것들을 처리합니다. 예를 들어 스레드 풀링, 클러스터링, 응급 복구는 컨테이너에 의해 수행됩니다. 스레드를 시작하면 그 중 일부가 손실 될 수 있습니다. 또한 컨테이너를 사용하면 실행되는 JVM에 영향을주지 않고 응용 프로그램을 다시 시작할 수 있습니다. 컨테이너 제어에서 스레드가있는 경우 어떻게 가능합니까?
이것이 J2EE 1.4 타이머 서비스가 도입 된 이유입니다. 자세한 내용은 이 기사를 참조하십시오.
Java EE를위한 동시성 유틸리티
핵심 Java EE API로 스레드를 작성하는 표준적이고 올바른 방법이 있습니다.
Concurrency Utils를 사용하면 컨테이너에서 새 스레드를 작성하고 관리하여 모든 EE 서비스를 사용할 수 있습니다.
여기 예
항상 컨테이너에 배포 설명 자의 일부로 작업을 시작하도록 지시 할 수 있습니다. 그러면 필요한 유지 관리 작업을 수행 할 수 있습니다.
규칙을 따라. 언젠가 당신이 한 일에 기뻐할 것입니다 :)
블루 프린트에 따라 Java EE 컨테이너에서 스레드가 금지됩니다. 자세한 내용은 청사진 을 참조하십시오.
그렇게하지 않을 실제 이유는 없습니다. 내가 사용 QUARZ를 함께 봄 문제없이 웹 애플리케이션에서. 또한 동시성 프레임 워크 java.util.concurrent
가 사용될 수있다. 자체 스레드 처리를 구현하는 경우 컨테이너가 언제든지 웹 애플리케이션을 언로드 할 수 있도록 theads를 deamon으로 설정 하거나 자체 deamon 스레드 그룹을 사용하십시오.
그러나 Bean 범위 세션 및 요청 은 생성 된 스레드에서 작동하지 않습니다. 또한 다른 코드가 즉시 ThreadLocal
작동하지 않으므로 값을 직접 생성 된 스레드로 전송해야합니다.
나는 그것이 올바르게하는 것이 쉽지 않다는 사실을 제외하고는 낙담하지 않았다는 것을 읽지 못했습니다.
상당히 낮은 수준의 프로그래밍이며 다른 낮은 수준의 기술과 마찬가지로 적절한 이유가 있어야합니다. 대부분의 동시성 문제는 스레드 풀과 같은 내장 구문을 사용하여 훨씬 효과적으로 해결할 수 있습니다.
EJB에서 일부 스레드를 생성 한 다음 컨테이너를 언로드하거나 EJB를 업데이트하려고하면 문제가 발생할 수 있습니다. 스레드가 필요하지 않은 작업을 수행하는 다른 방법은 거의 항상 있으므로 NO라고 말하십시오.
참고 URL : https://stackoverflow.com/questions/533783/why-is-spawning-threads-in-java-ee-container-discouraged
'Programming' 카테고리의 다른 글
널 포인터에 왜 주소 0이 사용됩니까? (0) | 2020.07.17 |
---|---|
babel-preset-stage-0, babel-preset-stage-1 등의 차이점은 무엇입니까? (0) | 2020.07.17 |
여러 파일에서 Javascript의 전역 변수 (0) | 2020.07.17 |
std :: atomic은 정확히 무엇입니까? (0) | 2020.07.17 |
파이썬에는 정렬 된 목록이 있습니까? (0) | 2020.07.17 |