package com.budwk.app; import cn.dev33.satoken.SaManager; import cn.dev33.satoken.config.SaTokenConfig; import com.budwk.app.base.utils.AppIocUtil; import com.budwk.app.flow.engine.FlowEngine; import com.budwk.app.sys.services.SysTaskService; import com.budwk.app.task.services.TaskPlatformService; import com.budwk.app.web.commons.auth.satoken.SaTokenContextImpl; import com.budwk.app.web.commons.auth.satoken.SaTokenDaoRedisImpl; import com.budwk.app.web.commons.auth.satoken.StpInterfaceImpl; import com.budwk.app.web.commons.base.Globals; import com.budwk.app.web.commons.ext.pubsub.WebPubSub; import com.budwk.app.zhgh.dayofficework.message.service.GlobalMessageSendService; import lombok.extern.slf4j.Slf4j; import org.beetl.core.GroupTemplate; import org.nutz.boot.NbApp; import org.nutz.dao.Dao; import org.nutz.dao.impl.FileSqlManager; import org.nutz.dao.sql.Sql; import org.nutz.dao.util.Daos; import org.nutz.integration.jedis.JedisAgent; import org.nutz.ioc.Ioc; import org.nutz.ioc.impl.PropertiesProxy; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.lang.Mirror; import org.nutz.mvc.Mvcs; import org.nutz.mvc.annotation.*; import org.quartz.Scheduler; import javax.management.MBeanServer; import javax.management.ObjectName; import javax.servlet.ServletContext; import java.lang.management.ManagementFactory; import java.sql.Driver; import java.sql.DriverManager; import java.util.Enumeration; import java.util.List; @IocBean(create = "init", depose = "depose") @Localization(value = "locales/", defaultLocalizationKey = "zh_CN") @Encoding(input = "UTF-8", output = "UTF-8") @ChainBy(args = "chain/mvc-chain.json") @Slf4j public class MainLauncher { protected static final String PRE = "security."; @Inject("refer:$ioc") private Ioc ioc; @Inject private PropertiesProxy conf; @Inject private JedisAgent jedisAgent; @Inject private WebPubSub webPubSub;//注入一下为了初始化 @Inject private GroupTemplate groupTemplate; @Inject private TaskPlatformService taskPlatformService; @Inject private SysTaskService sysTaskService; @Inject private Dao dao; public static void main(String[] args) throws Exception { NbApp nb = new NbApp().setArgs(args).setPrintProcDoc(true); nb.getAppContext().setMainPackage("com.budwk"); nb.run(); } public static NbApp warMain(ServletContext sc) { NbApp nb = new NbApp().setPrintProcDoc(true); nb.getAppContext().setMainPackage("com.budwk"); return nb; } public void init() { Mvcs.DISABLE_X_POWERED_BY = true; Globals.AppBase = Mvcs.getServletContext().getContextPath(); Globals.AppRoot = Mvcs.getServletContext().getRealPath("/"); init_sys(); init_task(); init_auth(); ioc.get(Globals.class); ioc.get(FlowEngine.class); ioc.get(GlobalMessageSendService.class); AppIocUtil.setIoc(ioc); } public void init_auth() { SaTokenConfig saTokenConfig = conf.makeDeep(SaTokenConfig.class, PRE); String tokenName = conf.get(PRE + "tokenName", "token"); // 注意这里的token默认超时时间与控制中心 websocket 超时时间保持一致 saTokenConfig.setTimeout(conf.getLong(PRE + "timeout", 86400)); saTokenConfig.setTokenName(tokenName); saTokenConfig.setIsV(false); SaManager.setConfig(saTokenConfig); SaManager.setSaTokenContext(ioc.get(SaTokenContextImpl.class)); SaManager.setSaTokenDao(ioc.get(SaTokenDaoRedisImpl.class)); SaManager.setStpInterface(ioc.get(StpInterfaceImpl.class)); } private void init_task() { if (log.isDebugEnabled() && !dao.exists("sys_qrtz_triggers") && !dao.exists("sys_qrtz_triggers".toUpperCase())) { //执行Quartz SQL脚本 String dbType = dao.getJdbcExpert().getDatabaseType(); log.debug("dbType:::" + dbType); FileSqlManager fmq = new FileSqlManager("db/quartz/" + dbType.toLowerCase() + ".sql"); List sqlListq = fmq.createCombo(fmq.keys()); Sql[] sqlsq = sqlListq.toArray(new Sql[sqlListq.size()]); for (Sql sql : sqlsq) { dao.execute(sql); } } } private void init_sys() { if (log.isDebugEnabled()) { //通过POJO类创建表结构 try { Daos.createTablesInPackage(dao, "com.budwk", false); //通过POJO类修改表结构 Daos.migration(dao, "com.budwk", true, false); // Daos.migration(dao, "com.budwk", true, false, false); } catch (Exception e) { e.printStackTrace(); } } } public void depose() { // 非mysql数据库,或多webapp共享mysql驱动的话,以下语句删掉 try { Mirror.me(Class.forName("com.mysql.jdbc.AbandonedConnectionCleanupThread")).invoke(null, "shutdown"); } catch (Throwable e) { } // 解决quartz有时候无法停止的问题 try { ioc.get(Scheduler.class).shutdown(true); } catch (Exception e) { } // 解决com.alibaba.druid.proxy.DruidDriver和com.mysql.jdbc.Driver在reload时报warning的问题 // 多webapp共享mysql驱动的话,以下语句删掉 Enumeration en = DriverManager.getDrivers(); while (en.hasMoreElements()) { try { Driver driver = en.nextElement(); String className = driver.getClass().getName(); log.debug("deregisterDriver: " + className); DriverManager.deregisterDriver(driver); } catch (Exception e) { } } try { MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); ObjectName objectName = new ObjectName("com.alibaba.druid:type=MockDriver"); if (mbeanServer.isRegistered(objectName)) mbeanServer.unregisterMBean(objectName); objectName = new ObjectName("com.alibaba.druid:type=DruidDriver"); if (mbeanServer.isRegistered(objectName)) mbeanServer.unregisterMBean(objectName); } catch (Exception ex) { } } }