2010-04-25 4 views
3

저는 인터뷰에서 주어진 JavaEE 과제를 구현하고 있습니다.JavaEE는 실제로 이식 가능합니까?

나는 EJB에 대한 사전 경험이 있지만 JMS 및 MDB와 관련이 없다. jms

  • activationConfig 속성은 일 년 동안, JBoss에서의 필요, 예를 topic/queue 위해 -

    • 응용 프로그램 서버가 서로 다른 JNDI 이름에 자신의 주제와 큐를 바인딩 : 그래서 여기에 내가 수많은 예제를 통해 찾을거야 튜토리얼은 그렇지 않습니다.
    • 내 응용 프로그램을 시작한 후 jboss는 내 주제가 바운드되지 않았 음을 경고합니다. (사실은 아닙니다 - 저는 바인딩하지 않았지만 자동으로 바인딩 될 것으로 기대합니다.) 사실 JBoss 4.0의 예에서 자동 바인딩이 발생하는 것 같습니다). 제안 된 솔루션은 일부 jboss 파일에 매핑하거나 jboss 관련 주석을 사용하는 것입니다.

    이것은 JBoss 일 수도 있지만 spec을 구현하도록 인증되었으므로 사양에서 이러한 사항을 지정하지 않은 것으로 보입니다. 그리고 거기에 모든 이식 가능성은 사라집니다.

    그래서 JavaEE가 이식성이 있고 다른 애플리케이션 서버에 배포하고 마술처럼 실행할 수 있다고 주장하는 이유는 무엇입니까?

    P. 호언 장담에 대해 유감스럽게 생각합니다.하지만 내가 잘못하고 있다고 생각합니다. 의견을 말하십시오.

  • 답변

    8

    Java EE는 (거의 모든) 표준과 유사하지만 구현자가 준수를 광고하려고 노력하지만 필사적으로 준수하고 싶지는 않습니다.

    이 질문을 고려하십시오 : 어떻게 빨간 모자가 돈을 벌지? 물건을 버리거나 팔아서? 작성한 코드를 다른 Java EE 응용 프로그램 서버로 쉽게 전송할 수 있다면 비용이 많이들 것입니다. 이에 대한 해결책은 Microsoft에 기인 한 최초의 표준이 발표 된 이래로 상용 소프트웨어 공급 업체에게 실제로 사용되는 도구였던 훌륭한 "포용 및 확장"기술입니다. 당신이 당신의 코드를 다음 보스 (또는 제로니모 (또는 조나스 (또는 ...))) 그뿐만 아니라 유일한 변경되는 어떤 다른 호환 응용 프로그램 서버를 실행에 자바 EE API에 엄격하게 스틱 경우

    서버 별 배치 설명자에 필요합니다. 이것은 포용 단계입니다.

    각 서버 - 상업용 서버 (특히 JBoss와 같은)! 또한 "일을 더 쉽게"하기 위해 API에 여분의 요소를 추가하는 경향이 있습니다. (개발자가, 특히 표준 API에 친숙하지 않은 개발자는)이 API를 어떤 방식 으로든 랩핑하지 않고 이러한 여분의 API에 의존하는 경향에 빠지기 때문에 이러한 확장이 침수 될 수 있습니다 플랫폼을 변경하려는 경우 제거하기 어려운 시점까지 코드를 작성하십시오. 이것은 확장 단계입니다.

    소프트웨어 히스토리의 어느 지점에서든 표준을 정하면 사람들이 포용하고 확장하는 것을 볼 수 있습니다. (사람들이 "치명적인 포용"에 대해 이야기 할 때 벤더 잠금 문제에서 내 생각을 강제로 이동시켜야합니다. 적절한 용어). 또한 최종 사용자 (개발자 또는 기타)를 찾을 수 있습니다. Java EE는 이와 관련하여 다른 어떤 기술과 다른 점이 없습니다.

    그런 다음 당신은 그냥 ... 더 정확하게 EJB 3.1 부분적인 대답하지만 자바 EE 6의

    +2

    사실, 그걸 벗어날 수있는 순수한 능력은 그걸 가지고 머물러야 할 아주 좋은 이유 일 수 있습니다. –

    +1

    다시 한 번 사람들은 표준을 완성하지도 못했지만 여전히 확장하고 있습니다. –

    +0

    글쎄, 그래. 그것들은 나를 포용하는 것보다 훨씬 더 똑딱 거리고 사람들을 확장시킵니다. –

    0

    핵심 EE 응용 프로그램은 변경되지 않고 실행할 수 있습니다. 외부 구성은 응용 프로그램 서버마다 다릅니다.

    +0

    내가 언급했듯이 이것은 매우 기본적인 핵심 JavaEE, 즉 메시지를 주제로 보내는 MDB 및 EJB입니다. – Bozho

    +0

    기본적으로 응용 프로그램 서버에서 가변적 인 문자열이있는 경우 외부에서 (JNDI에서) 또는 응용 프로그램 특정 구성 파일에서 해당 값을 지정합니다. "where this can find"문자열은 - 명세에 명시 적으로 지정되지 않은 한 - 그러한 값입니다. –

    1

    을 대부분의 사양이 얼마나 심하게 어조를 고려하여, 마침내 Portable Global JNDI Names를 지정합니다. Java EE 6 이전에는 JNDI 이름이 표준화되지 않았고 각 응용 프로그램 서버 공급 업체는 its own rules을 사용하여 실제로 이식성이 떨어졌습니다. 따라서 J2EE 1.4 세계에서 엔터프라이즈 애플리케이션의 이식성을 쉽게하려면 다양한 전략 (일반적으로 ServiceLocator 클래스)을 구현해야합니다. Java EE 5에서 종속성 삽입 기능이 도입됨에 따라 조회 필요성이 줄어들었고 이식성이 "향상"되었지만 JNDI 조회가 필요한 시점에 polyglot ServiceLocator이 여전히 필요합니다.

    2

    조엘은 "all non-trivial abstractions are, to some degree, leaky"이라고 말합니다. 나는 이것이 JavaEE에 매우 적용 가능하다는 것을 알았다. JMS 예외가 전체 대기열과 같은 일시적 일 수 있다고 생각하십시오. 이것은 전형적인 빠른 생산자/느린 소비자 문제이며 이상적으로 생산자는 소비자의 속도와 일치하도록 조절할 것입니다. 그러나 오류는 권한 부여 실패와 같이 치명적일 수도 있습니다. 첫 번째 경우 재시도는 결국 성공하지만 (보통), 두 번째 경우에는 인간이 권한 부여 실패를 수정하기 위해 개입 할 때까지 재시도가 도움이되지 않습니다.

    그렇다면 휴대용 프로그램에서이 문제를 해결하려면 어떻게해야합니까? 한 가지 방법은 모든 JMS 예외를 치명적인 것으로 처리하는 것입니다. 모든 개체를 닫고 프로그램을 다시 초기화하십시오. 일종의 해고와 함께 비행을 죽이는 것 같지만 매우 휴대 가능합니다. 또는 JMS 예외를 검사하여 일시적인 오류인지 치명적인 오류인지 확인하고 적절한 조치를 취할 수 있습니다. 이것은 훨씬 더 효율적이지만 JMS 예외가 제공자마다 다르므로 이식성이 거의 없습니다. 일부 고객은 JMS 예외를 잡아 내고 코드에 "이식성"(하드웨어 추상화 계층과 동일한 소프트웨어)을 구현할 수 있도록 벤더에 적합한 것을 수행하는 벤더 특정 코드를 작성하는 방식을 택했습니다.

    물론 이것은 예외 처리 일뿐입니다. 유사한 문제가 전 세계적으로 존재합니다. 재 연결 세부 사항을 고려하십시오. 일부 전송은 응용 프로그램이나 컨테이너에 연결 실패를 일으킬 수 있습니다. 어떤 사람들은 코드가 이것을 알 필요가 없다는 생각으로 숨 깁니다. 그러나 현실적으로 네트워크가 영구적으로 중단되는 경우 거의 모든 메시징 응용 프로그램에서 경고 또는 로그 항목을 제공해야합니다. 네트워크에 문제가 생기면 앱이 영원히 멈추는 것을 원하지 않을 것입니다. 결국 투명 재접속을 제공하는 전송 장치에서 실행되는 앱조차도 연결 실패를 코드화해야합니다. 전송 공급자의 특정 기능 및 동작은 JMS의 추상화를 통해 누출됩니다.

    돈을 벌기 위해 JavaEE는 스킬을 전송 공급 업체에 이식합니다. 응용 프로그램은 표면까지 버블 링되는 추상화를 처리 할 기본 전송 공급자를 충분히 인식해야합니다. 누출을 피할 수있을 정도로 앱은 이식성이 있지만 더 이상 없습니다.

    +0

    +1 "더 휴대용 기술". 그것은 역사적으로 아무도 실제로 표준을 고수하지 못하기 때문에 모든 표준의 주요 이점입니다. –

    관련 문제