Liferay 시작 프로세스 분석 3 - 시작 이벤트 처리(첫 번째 섹션)
17785 단어 Liferay 시작 프로세스 분석
ainServlet에서 Struts 중앙 컨트롤러를 시작한 후 첫 번째 일은 시작 이벤트를 처리하는 것입니다.
- protected void processStartupEvents() throws Exception {
- StartupAction startupAction = new StartupAction();
-
- startupAction.run(null);
- }
Startup Action의 run 방법을 사용하고 DoRun () 방법을 사용합니다. 여기에는 여러 가지 일이 있습니다.
(1) 콘솔에서 제품 버전 정보를 인쇄합니다.
- // Print release information
-
- System.out.println("Starting " + ReleaseInfo.getReleaseInfo());
이 버전 정보는 ReleaseInfo 클래스에서 확인할 수 있습니다.
- public static final String getReleaseInfo() {
- return releaseInfo;
- }
- static String releaseInfo =
- releaseInfoPrefix + name + " " + versionDisplayName + " (" + codeName +
- " / Build " + build + " / " + date + ")" + releaseInfoSuffix;
이러한 상수는 ReleaseInfo 클래스에서 찾을 수 있습니다. 따라서 콘솔에 표시됩니다.
- Starting Liferay Portal Community Edition 6.1.0 CE (Paton / Build 6100 / January 6, 2012)
(2) 잠금 정보 비우기:
- try {
- LockLocalServiceUtil.clear();
- }
LockLocal ServiceUtil에서 clear () 메서드를 호출합니다.
- public static void clear()
- throws com.liferay.portal.kernel.exception.SystemException {
- getService().clear();
- }
LockLocal ServiceImpl 클래스에서 clear() 메서드를 호출합니다.
- public void clear() throws SystemException {
- lockPersistence.removeByLtExpirationDate(new Date());
- }
더 나아가 LocalPersistenceImpl 클래스의 removeByLtExpirationDate 방법을 호출합니다.
- /**
- * Removes all the locks where expirationDate < ? from the database.
- *
- * @param expirationDate the expiration date
- * @throws SystemException if a system exception occurred
- */
- public void removeByLtExpirationDate(Date expirationDate)
- throws SystemException {
- for (Lock lock : findByLtExpirationDate(expirationDate)) {
- remove(lock);
- }
- }
데이터베이스에서 만료된 모든 자물쇠를 제거하고 현재 날짜를 기준으로 아래는 펼치지 않습니다.
(3) 모든 훅을 닫기:
현재 응용 프로그램이 실행될 때 모든 Hook을 닫습니다.
- Runtime runtime = Runtime.getRuntime();
-
- runtime.addShutdownHook(new Thread(new ShutdownHook()));
모든 Hook은 Runnable 인터페이스를 실현하고 인쇄 작업만 할 수 있는 새로운 Thread를 엽니다.
- public class ShutdownHook implements Runnable {
-
- public void run() {
- if (GetterUtil.getBoolean(
- System.getProperty("shutdown.hook.print.full.thread.dump"))) {
-
- printFullThreadDump();
- }
- }
- ...
이 훅들은 Liferay 응용 프로그램이 실행될 때 추가됩니다. 실행할 때 shutdown 훅의 권한이 있는지 확인한 다음 shutdown 훅을 합니다.
- public void addShutdownHook(Thread hook) {
- SecurityManager sm = System.getSecurityManager();
- if (sm != null) {
- sm.checkPermission(new RuntimePermission("shutdownHooks"));
- }
- ApplicationShutdownHooks.add(hook);
- }
차례로 찾아보면 이permission이%LIFERAY_에 정의되어 있음HOME%/tomcat-7.0.23/conf/catalina.정책에서, 그래서 우리는 이 권한을 가지고 있다.
- ...
- permission java.io.FilePermission
- "${catalina.base}${file.separator}logs${file.separator}*", "read, write";
-
- permission java.lang.RuntimePermission "shutdownHooks";
- permission java.lang.RuntimePermission "getClassLoader";
- permission java.lang.RuntimePermission "setContextClassLoader";
- ...
이후 hook을 Application Shutdown Hooks의hashmap에 추가하여 닫습니다.
- static {
- Shutdown.add(1 /* shutdown hook invocation order */,
- new Runnable() {
- public void run() {
- runHooks();
- }
- });
- }
(4) Security Manager 구성
- // Security manager
-
- String portalSecurityManagerStrategy =
- PropsValues.PORTAL_SECURITY_MANAGER_STRATEGY;
-
- if (portalSecurityManagerStrategy.equals("smart")) {
- if (ServerDetector.isWebSphere()) {
- portalSecurityManagerStrategy = "none";
- }
- else {
- portalSecurityManagerStrategy = "default";
- }
- }
-
- if (portalSecurityManagerStrategy.equals("liferay")) {
- if (System.getSecurityManager() == null) {
- System.setSecurityManager(new PortalSecurityManager());
- }
- }
- else if (portalSecurityManagerStrategy.equals("none")) {
- System.setSecurityManager(null);
- }
Security Manager의 정책을 먼저 확인합니다.
- public static final String PORTAL_SECURITY_MANAGER_STRATEGY = PropsUtil.get(PropsKeys.PORTAL_SECURITY_MANAGER_STRATEGY);
이 키의 키는 PropsKeys 인터페이스에서 제공됩니다.
- public static final String PORTAL_SECURITY_MANAGER_STRATEGY = "portal.security.manager.strategy";
결국 우리는 포탈을 방문하러 갔다.properties에서 볼 수 있는 것은:
- ##
- ## Security Manager
- ##
-
- #
- # Set this property to "default" to use the default security manager
- # configured by the application server. A security manager will not be used
- # if the application server did not configure one.
- #
- # Set this property to "liferay" to use Liferay's security manager if the
- # application server has not configured a security manager.
- #
- # Set this property to "none" to explicitly remove the security manager
- # regardless of whether one is configured. This ensures that the portal is
- # run in a JVM without a security manager.
- #
- # Set this property to "smart" to allow the portal decide which strategy to
- # use based on which application server it is on.
- #
- portal.security.manager.strategy=smart
따라서 "smart"정책을 사용하기 때문에 다음 코드를 실행합니다.
- if (portalSecurityManagerStrategy.equals("smart")) {
- if (ServerDetector.isWebSphere()) {
- portalSecurityManagerStrategy = "none";
- }
- else {
- portalSecurityManagerStrategy = "default";
- }
- }
우리 서버는 웹 sphere가 아닌tomcat을 사용하기 때문에else 코드 세그먼트, 즉 우리의portalSecurity 관리자 전략은'default'를 사용합니다. 이런 상황에서tomcat 응용 서버의 보안 정책을 사용합니다.