diff --git a/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/utils/CommonUtils.java b/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/utils/CommonUtils.java index 4627ee53..08da3c00 100644 --- a/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/utils/CommonUtils.java +++ b/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/utils/CommonUtils.java @@ -7,6 +7,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; import java.util.Collection; +import java.util.UUID; import java.util.function.Supplier; @@ -146,4 +147,12 @@ public class CommonUtils { return OmsConstant.NONE; } + /** + * 生成 UUID + * @return uuid + */ + public static String genUUID() { + return StringUtils.replace(UUID.randomUUID().toString(), "-", ""); + } + } diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/OhMyApplication.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/OhMyApplication.java index 686a4c60..a5a0ddcd 100644 --- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/OhMyApplication.java +++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/OhMyApplication.java @@ -2,6 +2,7 @@ package com.github.kfcfans.powerjob.server; import com.github.kfcfans.powerjob.server.akka.OhMyServer; import com.github.kfcfans.powerjob.server.common.utils.OmsFileUtils; +import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.springframework.boot.SpringApplication; @@ -45,14 +46,18 @@ public class OhMyApplication { } } - private static void pre() { + @VisibleForTesting + public static void pre() { log.info(TIPS); // 删除历史遗留的 H2 数据库文件 + File oldH2 = new File(OmsFileUtils.genH2BasePath()); try { - FileUtils.forceDeleteOnExit(new File(OmsFileUtils.genH2Path())); + if (oldH2.exists()) { + FileUtils.forceDelete(oldH2); + } }catch (Exception e) { - log.warn("[PowerJob] delete h2 workspace({}) failed, if server can't startup successfully, please delete it manually", OmsFileUtils.genH2Path(), e); + log.warn("[PowerJob] delete h2 workspace({}) failed, if server can't startup successfully, please delete it manually", oldH2, e); } } diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/common/utils/OmsFileUtils.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/common/utils/OmsFileUtils.java index 1f5a0f76..ea35028d 100644 --- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/common/utils/OmsFileUtils.java +++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/common/utils/OmsFileUtils.java @@ -1,13 +1,12 @@ package com.github.kfcfans.powerjob.server.common.utils; -import org.apache.commons.lang3.StringUtils; +import com.github.kfcfans.powerjob.common.utils.CommonUtils; import org.apache.commons.lang3.exception.ExceptionUtils; import org.springframework.util.DigestUtils; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; -import java.util.UUID; /** * 文件工具类,统一文件存放地址 @@ -49,17 +48,19 @@ public class OmsFileUtils { * @return 临时目录 */ public static String genTemporaryWorkPath() { - String uuid = StringUtils.replace(UUID.randomUUID().toString(), "-", ""); - return genTemporaryPath() + uuid + "/"; + return genTemporaryPath() + CommonUtils.genUUID() + "/"; } /** * 获取 H2 数据库工作目录 * @return H2 工作目录 */ - public static String genH2Path() { + public static String genH2BasePath() { return COMMON_PATH + "h2/"; } + public static String genH2WorkPath() { + return genH2BasePath() + CommonUtils.genUUID() + "/"; + } /** * 将文本写入文件 diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/config/MultiDatasourceConfig.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/config/MultiDatasourceConfig.java index f233bc99..88693d16 100644 --- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/config/MultiDatasourceConfig.java +++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/config/MultiDatasourceConfig.java @@ -36,7 +36,7 @@ public class MultiDatasourceConfig { public DataSource initOmsLocalDatasource() { HikariConfig config = new HikariConfig(); config.setDriverClassName(H2_DRIVER_CLASS_NAME); - config.setJdbcUrl(String.format(H2_JDBC_URL_PATTERN, OmsFileUtils.genH2Path())); + config.setJdbcUrl(String.format(H2_JDBC_URL_PATTERN, OmsFileUtils.genH2WorkPath())); config.setAutoCommit(true); // 池中最小空闲连接数量 config.setMinimumIdle(H2_MIN_SIZE); diff --git a/powerjob-server/src/test/java/com/github/kfcfans/powerjob/server/test/UtilsTest.java b/powerjob-server/src/test/java/com/github/kfcfans/powerjob/server/test/UtilsTest.java index 8350e6e5..cfe39ba7 100644 --- a/powerjob-server/src/test/java/com/github/kfcfans/powerjob/server/test/UtilsTest.java +++ b/powerjob-server/src/test/java/com/github/kfcfans/powerjob/server/test/UtilsTest.java @@ -1,5 +1,6 @@ package com.github.kfcfans.powerjob.server.test; +import com.github.kfcfans.powerjob.server.OhMyApplication; import com.github.kfcfans.powerjob.server.common.utils.CronExpression; import com.github.kfcfans.powerjob.server.common.utils.timewheel.HashedWheelTimer; import com.github.kfcfans.powerjob.server.common.utils.timewheel.TimerFuture; @@ -91,4 +92,9 @@ public class UtilsTest { System.out.println(StringUtils.containsWhitespace(goodAppName)); System.out.println(StringUtils.containsWhitespace(appName)); } + + @Test + public void testPre() { + OhMyApplication.pre(); + } } diff --git a/powerjob-worker-samples/src/main/java/com/github/kfcfans/powerjob/samples/OhMySchedulerConfig.java b/powerjob-worker-samples/src/main/java/com/github/kfcfans/powerjob/samples/OhMySchedulerConfig.java index 3cc8b8ca..b4316a36 100644 --- a/powerjob-worker-samples/src/main/java/com/github/kfcfans/powerjob/samples/OhMySchedulerConfig.java +++ b/powerjob-worker-samples/src/main/java/com/github/kfcfans/powerjob/samples/OhMySchedulerConfig.java @@ -34,8 +34,7 @@ public class OhMySchedulerConfig { config.setAppName("powerjob-agent-test"); config.setServerAddress(serverAddress); // 如果没有大型 Map/MapReduce 的需求,建议使用内存来加速计算 - // 为了本地模拟多个实例,只能使用 MEMORY 启动(文件只能由一个应用占有) - config.setStoreStrategy(StoreStrategy.MEMORY); + config.setStoreStrategy(StoreStrategy.DISK); // 2. 创建 Worker 对象,设置配置文件 OhMyWorker ohMyWorker = new OhMyWorker(); diff --git a/powerjob-worker-samples/src/main/java/com/github/kfcfans/powerjob/samples/tester/StopInstanceTester.java b/powerjob-worker-samples/src/main/java/com/github/kfcfans/powerjob/samples/tester/StopInstanceTester.java new file mode 100644 index 00000000..4a70523c --- /dev/null +++ b/powerjob-worker-samples/src/main/java/com/github/kfcfans/powerjob/samples/tester/StopInstanceTester.java @@ -0,0 +1,25 @@ +package com.github.kfcfans.powerjob.samples.tester; + +import com.github.kfcfans.powerjob.worker.core.processor.ProcessResult; +import com.github.kfcfans.powerjob.worker.core.processor.TaskContext; +import com.github.kfcfans.powerjob.worker.core.processor.sdk.BasicProcessor; +import org.springframework.stereotype.Component; + +/** + * 测试用户反馈的无法停止实例的问题 + * https://github.com/KFCFans/PowerJob/issues/37 + * + * @author tjq + * @since 2020/7/30 + */ +@Component +public class StopInstanceTester implements BasicProcessor { + @Override + public ProcessResult process(TaskContext context) throws Exception { + int i = 0; + while (true) { + System.out.println(i++); + Thread.sleep(1000*10); + } + } +} diff --git a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/OhMyWorker.java b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/OhMyWorker.java index 5b43a04c..65719f48 100644 --- a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/OhMyWorker.java +++ b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/OhMyWorker.java @@ -186,11 +186,13 @@ public class OhMyWorker implements ApplicationContextAware, InitializingBean, Di private static void pre() { // 删除历史遗留的 H2 数据库文件 - String h2Path = OmsWorkerFileUtils.getH2Dir(); + File oldH2File = new File(OmsWorkerFileUtils.getH2BaseDir()); try { - FileUtils.forceDeleteOnExit(new File(h2Path)); + if (oldH2File.exists()) { + FileUtils.forceDelete(oldH2File); + } }catch (Exception e) { - log.warn("[PowerJob] delete h2 workspace({}) failed, if worker can't startup successfully, please delete it manually", h2Path, e); + log.warn("[PowerJob] delete h2 workspace({}) failed, if worker can't startup successfully, please delete it manually", oldH2File, e); } } } diff --git a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/common/utils/OmsWorkerFileUtils.java b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/common/utils/OmsWorkerFileUtils.java index 823e5504..85a2eb65 100644 --- a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/common/utils/OmsWorkerFileUtils.java +++ b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/common/utils/OmsWorkerFileUtils.java @@ -1,5 +1,7 @@ package com.github.kfcfans.powerjob.worker.common.utils; +import com.github.kfcfans.powerjob.common.utils.CommonUtils; + /** * 文件工具类 * @@ -19,7 +21,10 @@ public class OmsWorkerFileUtils { return WORKER_DIR + "container/"; } - public static String getH2Dir() { + public static String getH2BaseDir() { return WORKER_DIR + "h2/"; } + public static String getH2WorkDir() { + return WORKER_DIR + "h2/" + CommonUtils.genUUID() + "/"; + } } diff --git a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/persistence/ConnectionFactory.java b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/persistence/ConnectionFactory.java index aa630a9b..5fd2b537 100644 --- a/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/persistence/ConnectionFactory.java +++ b/powerjob-worker/src/main/java/com/github/kfcfans/powerjob/worker/persistence/ConnectionFactory.java @@ -20,8 +20,8 @@ public class ConnectionFactory { private static volatile DataSource dataSource; - private static final String DISK_JDBC_URL = String.format("jdbc:h2:file:%spowerjob_worker_db", OmsWorkerFileUtils.getH2Dir()); - private static final String MEMORY_JDBC_URL = String.format("jdbc:h2:mem:%spowerjob_worker_db", OmsWorkerFileUtils.getH2Dir()); + private static final String DISK_JDBC_URL = String.format("jdbc:h2:file:%spowerjob_worker_db", OmsWorkerFileUtils.getH2WorkDir()); + private static final String MEMORY_JDBC_URL = String.format("jdbc:h2:mem:%spowerjob_worker_db", OmsWorkerFileUtils.getH2WorkDir()); public static Connection getConnection() throws SQLException { return getDataSource().getConnection();