ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JEUS] ClassLoader(Classloading) 및 Class 동적반영
    java/WEB WAS 2021. 8. 19. 12:53
    728x90
    반응형

     포스팅은 ClassLoader 및 Class 동적 반영에 대해 알아보도록 하겠습니다.


     

    먼저 JEUS CLASSLOADING 순서 와 CLASSLOADING 방식에 대해 알아보겠습니다.

    1. JEUS ROOT CLASSLOADER에 추가 되는 순서와 Library

    • -Djeus.prepend.classpath (patch 적용시 사용하는 옵션 내용) & $JEUS_HOME/lib/jext/jext*.jar
    (since JEUS6 fix7 이후버전에서 patch 적용 위치)
    • lib/system/jext*.jar
    • lib/system/jeus.jar
    • lib/system/tools.jar
    • lib/system/*.jar or *.zip except for jeus.jar, extension.jar, and bootstrap.jar
    • lib/application/
    • lib/thirdparty/*.jar or *.zip
    • lib/application/*.jar or *.zip
    • lib/datasource/*.jar or *.zip
    • -Djeus.server.classpath (container의 경우는 user-class-path)
    • -Djeus.server.dir

    [내 용]

     

    2. CLASSLOADING 방식의 이해
    2-1. ISOLATED 방식 : 표준 방식



    1) ISOLATED 방식으로 WEB에서 EJB 호출 시

    (1) WEB Application에 EJB의 home, bean, object, stub,skeleton class를 Copy 한 후 참조 및 호출가능하다.
    (2) Copy 위치 : $WEBHOME/WEB-INF/classes (class 파일로 존재) $WEBHOME/WEB-INF/lib (jar파일로 존재)
    (3) stub, skeleton class는 JEUSMain.xml의 <class-ftp>true</class-ftp> 옵션을 true로 설정 시 copy 하지 않아도 사용할 수 있다. 위의 옵션을 더라도 EJB의 home, bean, object class는 copy를 해야 호출 가능하다.

    2) WEB과 EJB가 서로 참조해야 하는 library 인 경우 JEUS root Class loader가 읽도록 하거나, EAR 모듈로 구성한다.

     

    2-2. SHARED 방식



    1) SHREAD방식으로 WEB에서 EJB 호출 시 (동일 Container만 가능)

    (1) WEB Application에 EJB의 모든 class를 Copy 하지 않아도 참조 및 호출이 가능하다. (둘다 SHARED 된 경우)
    (2) WEB과 EJB는 CLASS를 공유하고 있기 때문에 EJB나 WEB중 하나만 변경 되더라도 Application시 둘 다 redeploy 해야 한다.
    # SHREAD의 의미
    EJB의 SHARED는 자신의 class를 WEB에 노출. WEB의 SHARED 된 EJB Class를 참조 하겠다는 의미이다.

     

    3 SHARED 방식 인 경우 사용되는 ClassLoader
    1) Root ClassLoader : jeus.server.RootClassLoader
    2) Servlet ClassLoader : jeus.servlet.loader.ContextLoader : WEB-INF/classes, WEB-INF/lib 라이브러리
    3) EJB ClassLoader : jeus.ejb.util.EJBRootClassLoader : EJB 의 class
    4) SHARED 옵션 ClassLoader : jeus.service.archive.ArchiveArrayClassLoader : 동일 container의 web application에서 EJB library 읽는 경우
    <application><classloading>SHARED</classloading></application>

     

    4. loading 된 class 들 확인 옵션

    [설정 내용]

    <engine-container>
    <name>container1</name>
    <command-option>-Xms256m -Xmx512m -verbose</command-option>

    [로그 내용]

    [Loaded jeus.util.oneport.OnePortIOFactory from file:/C:/TmaxSoft/JEUS6.0/lib/system/jeusutil.jar]
    [Loaded jeus.util.oneport.JDK14OnePortIOFactory from
    file:/C:/TmaxSoft/JEUS6.0/lib/system/jeusutil.jar]
    [Loaded jeus.util.oneport.SocketChannelOnePortInputStream from
    file:/C:/TmaxSoft/JEUS6.0/lib/system/jeusutil.jar]
    [Loaded jeus.util.oneport.SocketOnePortInputStream from
    file:/C:/TmaxSoft/JEUS6.0/lib/system/jeusutil.jar]
    [Loaded jeus.util.oneport.JDK13OnePortSocket from
    file:/C:/TmaxSoft/JEUS6.0/lib/system/jeusutil.jar]
    [Loaded jeus.util.oneport.JDK14OnePortSocket from
    file:/C:/TmaxSoft/JEUS6.0/lib/system/jeusutil.jar]

     

     

    위와 같이 Webapplication / EJB를 혼용하여 사용하는 Enterprise Archive의 경우 각각의 Class를 로딩하여 사용하기 위해 Shared라는 옵션을 사용합니다.

     

    다음으로 Class 동적반영입니다.

    directory 모드의 Application 에 대해 class 변경이 빈번하여, 동적 reload 가 필요한 경우, 이를 적용하는 2가지 방법에 대해서 기술 합니다. 운영 시에는 class 동적 반영을 하지 않는 것을 권고 합니다.
    1. 반영 방법

    a. jeus-web-dd.xml 설정 변경

    <check-on-demand>true</check-on-demand>

    - 해당하는 클래스의 요청이 있는 경우마다 class의 변경 유무를 확인하여 reloading하는 방식으로 운영이 아닌 개발용도로 사용하는 옵션이다.

    [설정 방법]

    $APPLICATION_HOME/WEB-INF/jeus-web-dd.xml 설정
    <check-on-demand>true</check-on-demand>
    <enable-reload>true</enable-reload>

     

    <enable-reload>true</enable-reload> 

    위 check-on-demand 옵션을 사용하지 않고 엔진 내부적으로 주기적인 간격(디폴트 : 5분)에 의해 변경된 클래스 체크 및 loading을 하는 옵션.
    해당 옵션은 주기적으로 클래스의 변경 여부를 체크하기 때문에 수행 시점에 CPU 사용률이 상대적으로 약간 높아질 수가 있으며, 이는 배포된 클래스의 수 및 시스템의 사양에 따라 각기 다르기 때문에 정확한 CPU 사용량은 실제 운영 장비에서 모니터링을 하면 확인이 가능.

    [설정 방법]

    $APPLICATION_HOME/WEB-INF/jeus-web-dd.xml 설정
    <check-on-demand>false</check-on-demand>
    <enable-reload>true</enable-reload>
    $JEUS_HOME/config/[node명]/[node명]_servlet_엔진명/WEBMain.xml 설정
    <monitoring>
    <check-thread-pool>60000</check-thread-pool>
    <check-class-reload>60000</check-class-reload>
    </monitoring>

     

    2. jeusadmin의 webreload 기능 사용

    reload 관련한 두 옵션이 모두 'false'로 지정하여 엔진 내부에서 reload 기능을 사용하지 않는 경우 JEUS에서 제공하는 command를 이용하여 필요 시점에 관리자가 직접 해당 ContextGroup을 대상으로 reload 하는 옵션입니다.

    [내 용]

    $APPLICATION_HOME/WEB-INF/jeus-web-dd.xml 설정
    <check-on-demand>false</check-on-demand>
    <enable-reload>false</enable-reload>
    JEUS ADMIN Command 실행 내용
    [ibmtest:/user/mkko]$ ja
    JEUS 6.0 (Fix#6) JEUS administration tool
    ibmtest>webreload -con ibmtest_container1 MyGroup
    < ContainerName : ibmtest_container1 >
    reload sucessful

    [실행 내용]

    [2013.01.11 10:56:38][2][b216] [container1-4] [WEB-3480] context (test) is started successfully
    [2013.01.11 10:56:38][2][b216] [container1-4] [WEB-3482] reloading a context(test) is completed successfully


    3. 클래스 재 로딩 시 고려할 사항
    30초 이상 수행되는 요청이 있는 경우 해당 처리가 끝날 때 까지(30초) 대기하게 되며 대기시간이 이를 초과하는 경우에는 아래와 같은 에러와 함께 Reloading 하지 않고 다음 reloading 주기 및 시점에 다시 reloading 처리를 하는 방식으로 동작합니다.

    jeus.servlet.deployment.StartingException: failed to doReload() because of timeout
    at jeus.servlet.engine.Context.doReload(Context.java:1299)
    at jeus.servlet.engine.Context.execReload(Context.java:893)
    at jeus.servlet.engine.RequestProcessor.doWorkRelatedReload(RequestProcessor.java:39
    at jeus.servlet.engine.WebtobRequestProcessor.run(WebtobRequestProcessor.java:168)

     

    이번 시간에는 JEUS ClassLoader와 동적 반영 방법에 대해 알아보았습니다.

    다음시간에 뵙겠습니다.

    고맙습니다.

    728x90
    반응형
Designed by Tistory.