ju
7 years ago
9 changed files with 314 additions and 261 deletions
@ -1,134 +1,29 @@ |
|||||||
package com.fr.start.server; |
package com.fr.start.server; |
||||||
|
|
||||||
import com.fr.base.FRContext; |
|
||||||
import com.fr.design.DesignerEnvManager; |
|
||||||
import com.fr.event.EventDispatcher; |
import com.fr.event.EventDispatcher; |
||||||
import com.fr.log.FineLoggerFactory; |
import com.fr.module.ModuleContext; |
||||||
import com.fr.module.ModuleRole; |
|
||||||
import com.fr.startup.FineWebApplicationInitializer; |
|
||||||
import com.fr.third.springframework.web.SpringServletContainerInitializer; |
|
||||||
import com.fr.third.springframework.web.context.support.AnnotationConfigWebApplicationContext; |
|
||||||
import org.apache.catalina.Context; |
|
||||||
import org.apache.catalina.LifecycleException; |
|
||||||
import org.apache.catalina.loader.VirtualWebappLoader; |
|
||||||
import org.apache.catalina.startup.Tomcat; |
|
||||||
|
|
||||||
import java.io.File; |
|
||||||
import java.util.HashSet; |
|
||||||
import java.util.Set; |
|
||||||
|
|
||||||
/** |
/** |
||||||
* Created by juhaoyu on 2018/6/5. |
* Created by juhaoyu on 2018/6/6. |
||||||
*/ |
*/ |
||||||
public class FineEmbedServer { |
public abstract class FineEmbedServer { |
||||||
|
|
||||||
private static final FineEmbedServer INSTANCE = new FineEmbedServer(); |
|
||||||
|
|
||||||
private Tomcat tomcat; |
|
||||||
|
|
||||||
private volatile boolean isRunning = false; |
|
||||||
|
|
||||||
public static FineEmbedServer getInstance() { |
|
||||||
|
|
||||||
return INSTANCE; |
|
||||||
} |
|
||||||
|
|
||||||
private FineEmbedServer() {} |
|
||||||
|
|
||||||
|
public synchronized static void start() { |
||||||
|
|
||||||
public synchronized void start() { |
|
||||||
|
|
||||||
if (isRunning) { |
|
||||||
return; |
|
||||||
} |
|
||||||
EventDispatcher.fire(EmbedServerEvent.BeforeStart); |
EventDispatcher.fire(EmbedServerEvent.BeforeStart); |
||||||
try { |
ModuleContext.getModule(FineEmbedServerActivator.class).start(); |
||||||
//初始化tomcat
|
|
||||||
initTomcat(); |
|
||||||
tomcat.start(); |
|
||||||
} catch (LifecycleException e) { |
|
||||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
||||||
} |
|
||||||
isRunning = true; |
|
||||||
EventDispatcher.fire(EmbedServerEvent.AfterStart); |
EventDispatcher.fire(EmbedServerEvent.AfterStart); |
||||||
} |
} |
||||||
|
|
||||||
public synchronized void stop() { |
public synchronized static void stop() { |
||||||
|
|
||||||
if (!isRunning) { |
|
||||||
return; |
|
||||||
} |
|
||||||
EventDispatcher.fire(EmbedServerEvent.BeforeStop); |
EventDispatcher.fire(EmbedServerEvent.BeforeStop); |
||||||
try { |
ModuleContext.getModule(FineEmbedServerActivator.class).stop(); |
||||||
stopSpring(); |
|
||||||
stopServerActivator(); |
|
||||||
stopTomcat(); |
|
||||||
} catch (LifecycleException e) { |
|
||||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
||||||
} |
|
||||||
isRunning = false; |
|
||||||
EventDispatcher.fire(EmbedServerEvent.AfterStop); |
EventDispatcher.fire(EmbedServerEvent.AfterStop); |
||||||
} |
} |
||||||
|
|
||||||
public boolean isRunning() { |
public static boolean isRunning() { |
||||||
|
|
||||||
return isRunning; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
private void initTomcat() { |
|
||||||
|
|
||||||
tomcat = new Tomcat(); |
|
||||||
|
|
||||||
tomcat.setPort(DesignerEnvManager.getEnvManager().getEmbedServerPort()); |
|
||||||
String docBase = new File(FRContext.getCurrentEnv().getPath()).getParent(); |
|
||||||
String appName = "/" + FRContext.getCurrentEnv().getAppName(); |
|
||||||
Context context = tomcat.addContext(appName, docBase); |
|
||||||
tomcat.addServlet(appName, "default", "org.apache.catalina.servlets.DefaultServlet"); |
|
||||||
//覆盖tomcat的WebAppClassLoader
|
|
||||||
context.setLoader(new FRTomcatLoader()); |
|
||||||
|
|
||||||
//直接指定initializer,tomcat就不用再扫描一遍了
|
|
||||||
SpringServletContainerInitializer initializer = new SpringServletContainerInitializer(); |
|
||||||
Set<Class<?>> classes = new HashSet<Class<?>>(); |
|
||||||
classes.add(FineWebApplicationInitializer.class); |
|
||||||
context.addServletContainerInitializer(initializer, classes); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
private void stopServerActivator() { |
|
||||||
|
|
||||||
ModuleRole.ServerRoot.stop(); |
|
||||||
} |
|
||||||
|
|
||||||
private void stopSpring() { |
|
||||||
|
|
||||||
AnnotationConfigWebApplicationContext context = ModuleRole.ServerRoot.getSingleton(AnnotationConfigWebApplicationContext.class); |
|
||||||
if (context != null) { |
|
||||||
context.stop(); |
|
||||||
context.destroy(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private void stopTomcat() throws LifecycleException { |
|
||||||
|
|
||||||
tomcat.stop(); |
return ModuleContext.getModule(FineEmbedServerActivator.class).isRunning(); |
||||||
tomcat.destroy(); |
|
||||||
} |
} |
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Created by juhaoyu on 2018/6/5. |
|
||||||
* 自定义的tomcat loader,主要用于防止内置服务器再加载一遍class |
|
||||||
*/ |
|
||||||
private static class FRTomcatLoader extends VirtualWebappLoader { |
|
||||||
|
|
||||||
@Override |
|
||||||
public ClassLoader getClassLoader() { |
|
||||||
|
|
||||||
return this.getClass().getClassLoader(); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
} |
} |
||||||
|
@ -0,0 +1,107 @@ |
|||||||
|
package com.fr.start.server; |
||||||
|
|
||||||
|
import com.fr.base.FRContext; |
||||||
|
import com.fr.design.DesignerEnvManager; |
||||||
|
import com.fr.event.EventDispatcher; |
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.module.Activator; |
||||||
|
import com.fr.module.ModuleRole; |
||||||
|
import com.fr.startup.FineWebApplicationInitializer; |
||||||
|
import com.fr.third.springframework.web.SpringServletContainerInitializer; |
||||||
|
import com.fr.third.springframework.web.context.support.AnnotationConfigWebApplicationContext; |
||||||
|
import org.apache.catalina.Context; |
||||||
|
import org.apache.catalina.LifecycleException; |
||||||
|
import org.apache.catalina.loader.VirtualWebappLoader; |
||||||
|
import org.apache.catalina.startup.Tomcat; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.util.HashSet; |
||||||
|
import java.util.Set; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by juhaoyu on 2018/6/5. |
||||||
|
*/ |
||||||
|
public class FineEmbedServerActivator extends Activator { |
||||||
|
|
||||||
|
private Tomcat tomcat; |
||||||
|
|
||||||
|
@Override |
||||||
|
public synchronized void start() { |
||||||
|
|
||||||
|
try { |
||||||
|
//初始化tomcat
|
||||||
|
initTomcat(); |
||||||
|
tomcat.start(); |
||||||
|
} catch (LifecycleException e) { |
||||||
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public synchronized void stop() { |
||||||
|
|
||||||
|
try { |
||||||
|
stopSpring(); |
||||||
|
stopServerActivator(); |
||||||
|
stopTomcat(); |
||||||
|
} catch (LifecycleException e) { |
||||||
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private void initTomcat() { |
||||||
|
|
||||||
|
tomcat = new Tomcat(); |
||||||
|
|
||||||
|
tomcat.setPort(DesignerEnvManager.getEnvManager().getEmbedServerPort()); |
||||||
|
String docBase = new File(FRContext.getCurrentEnv().getPath()).getParent(); |
||||||
|
String appName = "/" + FRContext.getCurrentEnv().getAppName(); |
||||||
|
Context context = tomcat.addContext(appName, docBase); |
||||||
|
tomcat.addServlet(appName, "default", "org.apache.catalina.servlets.DefaultServlet"); |
||||||
|
//覆盖tomcat的WebAppClassLoader
|
||||||
|
context.setLoader(new FRTomcatLoader()); |
||||||
|
|
||||||
|
//直接指定initializer,tomcat就不用再扫描一遍了
|
||||||
|
SpringServletContainerInitializer initializer = new SpringServletContainerInitializer(); |
||||||
|
Set<Class<?>> classes = new HashSet<Class<?>>(); |
||||||
|
classes.add(FineWebApplicationInitializer.class); |
||||||
|
context.addServletContainerInitializer(initializer, classes); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private void stopServerActivator() { |
||||||
|
|
||||||
|
ModuleRole.ServerRoot.stop(); |
||||||
|
} |
||||||
|
|
||||||
|
private void stopSpring() { |
||||||
|
|
||||||
|
AnnotationConfigWebApplicationContext context = ModuleRole.ServerRoot.getSingleton(AnnotationConfigWebApplicationContext.class); |
||||||
|
if (context != null) { |
||||||
|
context.stop(); |
||||||
|
context.destroy(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private void stopTomcat() throws LifecycleException { |
||||||
|
|
||||||
|
tomcat.stop(); |
||||||
|
tomcat.destroy(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Created by juhaoyu on 2018/6/5. |
||||||
|
* 自定义的tomcat loader,主要用于防止内置服务器再加载一遍class |
||||||
|
*/ |
||||||
|
private static class FRTomcatLoader extends VirtualWebappLoader { |
||||||
|
|
||||||
|
@Override |
||||||
|
public ClassLoader getClassLoader() { |
||||||
|
|
||||||
|
return this.getClass().getClassLoader(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
package com.fr.start.module; |
||||||
|
|
||||||
|
import com.fr.module.Activator; |
||||||
|
import com.fr.stable.CoreActivator; |
||||||
|
import com.fr.start.server.FineEmbedServerActivator; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by juhaoyu on 2018/6/6. |
||||||
|
* 基于env的模块启动关闭 |
||||||
|
*/ |
||||||
|
public class EnvBasedModule extends Activator { |
||||||
|
|
||||||
|
@Override |
||||||
|
public void start() { |
||||||
|
//core和设计器启动
|
||||||
|
getSub(CoreActivator.class).start(); |
||||||
|
getSub("designer").start(); |
||||||
|
//这里不启动tomcat,由客户手动触发
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void stop() { |
||||||
|
//先关闭tomcat(如果已经启动了的话)
|
||||||
|
getSub(FineEmbedServerActivator.class).stop(); |
||||||
|
//倒叙关闭其他模块
|
||||||
|
getSub("designer").stop(); |
||||||
|
getSub(CoreActivator.class).stop(); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue