165 lines
6.2 KiB
Java
165 lines
6.2 KiB
Java
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<Sql> 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<Driver> 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) {
|
|
}
|
|
}
|
|
}
|