Liferay 시작 프로세스 분석 3 - 시작 이벤트 처리(첫 번째 섹션)


ainServlet에서 Struts 중앙 컨트롤러를 시작한 후 첫 번째 일은 시작 이벤트를 처리하는 것입니다.

  
  
  
  
  1. protected void processStartupEvents() throws Exception { 
  2.     StartupAction startupAction = new StartupAction(); 
  3.  
  4.     startupAction.run(null); 

 
Startup Action의 run 방법을 사용하고 DoRun () 방법을 사용합니다. 여기에는 여러 가지 일이 있습니다.
(1) 콘솔에서 제품 버전 정보를 인쇄합니다.

  
  
  
  
  1. // Print release information 
  2.  
  3.         System.out.println("Starting " + ReleaseInfo.getReleaseInfo()); 

이 버전 정보는 ReleaseInfo 클래스에서 확인할 수 있습니다.

  
  
  
  
  1. public static final String getReleaseInfo() { 
  2.         return releaseInfo; 
  3.     } 

   
   
   
   
  1. static String releaseInfo = 
  2.         releaseInfoPrefix + name + " " + versionDisplayName + " (" + codeName + 
  3.             " / Build " + build + " / " + date + ")" + releaseInfoSuffix; 
이러한 상수는 ReleaseInfo 클래스에서 찾을 수 있습니다. 따라서 콘솔에 표시됩니다.

  
  
  
  
  1. Starting Liferay Portal Community Edition 6.1.0 CE (Paton / Build 6100 / January 6, 2012) 

 
(2) 잠금 정보 비우기:

  
  
  
  
  1. try { 
  2.             LockLocalServiceUtil.clear(); 
  3.         } 

LockLocal ServiceUtil에서 clear () 메서드를 호출합니다.

  
  
  
  
  1. public static void clear() 
  2.     throws com.liferay.portal.kernel.exception.SystemException { 
  3.     getService().clear(); 

LockLocal ServiceImpl 클래스에서 clear() 메서드를 호출합니다.

  
  
  
  
  1. public void clear() throws SystemException { 
  2.         lockPersistence.removeByLtExpirationDate(new Date()); 
  3.     } 

더 나아가 LocalPersistenceImpl 클래스의 removeByLtExpirationDate 방법을 호출합니다.

  
  
  
  
  1. /** 
  2.  * Removes all the locks where expirationDate < ? from the database. 
  3.  * 
  4.  * @param expirationDate the expiration date 
  5.  * @throws SystemException if a system exception occurred 
  6.  */ 
  7. public void removeByLtExpirationDate(Date expirationDate) 
  8.     throws SystemException { 
  9.     for (Lock lock : findByLtExpirationDate(expirationDate)) { 
  10.         remove(lock); 
  11.     } 

데이터베이스에서 만료된 모든 자물쇠를 제거하고 현재 날짜를 기준으로 아래는 펼치지 않습니다.
 
(3) 모든 훅을 닫기:
현재 응용 프로그램이 실행될 때 모든 Hook을 닫습니다.

  
  
  
  
  1. Runtime runtime = Runtime.getRuntime(); 
  2.  
  3.     runtime.addShutdownHook(new Thread(new ShutdownHook())); 

모든 Hook은 Runnable 인터페이스를 실현하고 인쇄 작업만 할 수 있는 새로운 Thread를 엽니다.

  
  
  
  
  1. public class ShutdownHook implements Runnable { 
  2.  
  3.     public void run() { 
  4.         if (GetterUtil.getBoolean( 
  5.                 System.getProperty("shutdown.hook.print.full.thread.dump"))) { 
  6.  
  7.             printFullThreadDump(); 
  8.         } 
  9.     } 
  10. ... 

이 훅들은 Liferay 응용 프로그램이 실행될 때 추가됩니다. 실행할 때 shutdown 훅의 권한이 있는지 확인한 다음 shutdown 훅을 합니다.

  
  
  
  
  1. public void addShutdownHook(Thread hook) { 
  2.     SecurityManager sm = System.getSecurityManager(); 
  3.     if (sm != null) { 
  4.         sm.checkPermission(new RuntimePermission("shutdownHooks")); 
  5.     } 
  6.     ApplicationShutdownHooks.add(hook); 
  7.     } 

차례로 찾아보면 이permission이%LIFERAY_에 정의되어 있음HOME%/tomcat-7.0.23/conf/catalina.정책에서, 그래서 우리는 이 권한을 가지고 있다.

  
  
  
  
  1.  ... 
  2. permission java.io.FilePermission 
  3.          "${catalina.base}${file.separator}logs${file.separator}*""read, write"
  4.  
  5.         permission java.lang.RuntimePermission "shutdownHooks"
  6.         permission java.lang.RuntimePermission "getClassLoader"
  7.         permission java.lang.RuntimePermission "setContextClassLoader"
  8. ... 

 
이후 hook을 Application Shutdown Hooks의hashmap에 추가하여 닫습니다.

  
  
  
  
  1. static { 
  2.       Shutdown.add(1 /* shutdown hook invocation order */
  3.           new Runnable() { 
  4.               public void run() { 
  5.                   runHooks(); 
  6.               } 
  7.           }); 
  8.   } 

 
(4) Security Manager 구성

  
  
  
  
  1. // Security manager 
  2.  
  3.         String portalSecurityManagerStrategy = 
  4.             PropsValues.PORTAL_SECURITY_MANAGER_STRATEGY; 
  5.  
  6.         if (portalSecurityManagerStrategy.equals("smart")) { 
  7.             if (ServerDetector.isWebSphere()) { 
  8.                 portalSecurityManagerStrategy = "none"
  9.             } 
  10.             else { 
  11.                 portalSecurityManagerStrategy = "default"
  12.             } 
  13.         } 
  14.  
  15.         if (portalSecurityManagerStrategy.equals("liferay")) { 
  16.             if (System.getSecurityManager() == null) { 
  17.                 System.setSecurityManager(new PortalSecurityManager()); 
  18.             } 
  19.         } 
  20.         else if (portalSecurityManagerStrategy.equals("none")) { 
  21.             System.setSecurityManager(null); 
  22.         } 

Security Manager의 정책을 먼저 확인합니다.

  
  
  
  
  1. public static final String PORTAL_SECURITY_MANAGER_STRATEGY = PropsUtil.get(PropsKeys.PORTAL_SECURITY_MANAGER_STRATEGY); 

이 키의 키는 PropsKeys 인터페이스에서 제공됩니다.

  
  
  
  
  1. public static final String PORTAL_SECURITY_MANAGER_STRATEGY = "portal.security.manager.strategy"

결국 우리는 포탈을 방문하러 갔다.properties에서 볼 수 있는 것은:

  
  
  
  
  1. ## 
  2. ## Security Manager 
  3. ## 
  4.  
  5.     # 
  6.     # Set this property to "default" to use the default security manager 
  7.     # configured by the application server. A security manager will not be used 
  8.     # if the application server did not configure one. 
  9.     # 
  10.     # Set this property to "liferay" to use Liferay's security manager if the 
  11.     # application server has not configured a security manager. 
  12.     # 
  13.     # Set this property to "none" to explicitly remove the security manager 
  14.     # regardless of whether one is configured. This ensures that the portal is 
  15.     # run in a JVM without a security manager. 
  16.     # 
  17.     # Set this property to "smart" to allow the portal decide which strategy to 
  18.     # use based on which application server it is on
  19.     # 
  20.     portal.security.manager.strategy=smart 

따라서 "smart"정책을 사용하기 때문에 다음 코드를 실행합니다.

  
  
  
  
  1. if (portalSecurityManagerStrategy.equals("smart")) { 
  2.         if (ServerDetector.isWebSphere()) { 
  3.             portalSecurityManagerStrategy = "none"
  4.         } 
  5.         else { 
  6.             portalSecurityManagerStrategy = "default"
  7.         } 
  8.     } 

우리 서버는 웹 sphere가 아닌tomcat을 사용하기 때문에else 코드 세그먼트, 즉 우리의portalSecurity 관리자 전략은'default'를 사용합니다. 이런 상황에서tomcat 응용 서버의 보안 정책을 사용합니다.
 

좋은 웹페이지 즐겨찾기