diff --git a/build.cmd b/build.cmd index c8885a930..0b34d8d33 100644 --- a/build.cmd +++ b/build.cmd @@ -30,5 +30,8 @@ echo "LTS: After sub window finished, close it , and press any key to continue" xcopy /e /y "%Startup_Dir%\target\lts-bin\lts\lib" "%LTS_Bin_Dir%\war\jetty\lib" cd ..\..\ -xcopy /e /y "%BASE_HOME%\lts-admin\target\lts-admin-%VERSION%.war" "%LTS_Bin_Dir%\war\lts-admin.war" +xcopy /e /y "%BASE_HOME%\lts-admin\target\lts-admin-%VERSION%.war" "%LTS_Bin_Dir%\war" +echo "LTS: rename war finished, close it , and press any key to continue" & pause>nul +cd %LTS_Bin_Dir%\war +ren lts-admin-%VERSION%.war lts-admin.war cd ..\..\ diff --git a/build.sh b/build.sh index 0beeb4227..04895c1d4 100644 --- a/build.sh +++ b/build.sh @@ -27,7 +27,10 @@ cp -rf $Startup_Dir/target/lts-bin/lts/* $Dist_Bin_Dir mkdir -p $Dist_Bin_Dir/war/jetty/lib mvn clean assembly:assembly -DskipTests -Plts-admin cp -rf $Startup_Dir/target/lts-bin/lts/lib $Dist_Bin_Dir/war/jetty -cp -rf $LTS_Bin_Dir/lts-admin/target/lts-admin-$VERSION.war $Dist_Bin_Dir/war/lts-admin.war + +cp -rf $LTS_Bin_Dir/lts-admin/target/lts-admin-$VERSION.war $Dist_Bin_Dir/war +cd $Dist_Bin_Dir/war +mv lts-admin-$VERSION.war lts-admin.war cd $LTS_Bin_Dir/dist zip -r lts-$VERSION-bin.zip lts-$VERSION-bin/* diff --git a/docs/lts.pdf b/docs/lts.pdf new file mode 100644 index 000000000..687b97734 Binary files /dev/null and b/docs/lts.pdf differ diff --git a/lts-admin/pom.xml b/lts-admin/pom.xml index fab10c4da..f115bf4f6 100644 --- a/lts-admin/pom.xml +++ b/lts-admin/pom.xml @@ -29,6 +29,137 @@ + + com.github.ltsopensource + lts + ${project.version} + + + com.github.ltsopensource lts-core @@ -88,7 +219,7 @@ javax.servlet javax.servlet-api 3.1.0 - provided + diff --git a/lts-admin/src/main/java/com/github/ltsopensource/handle/JobClientCompletedHandler.java b/lts-admin/src/main/java/com/github/ltsopensource/handle/JobClientCompletedHandler.java new file mode 100644 index 000000000..3a8e09239 --- /dev/null +++ b/lts-admin/src/main/java/com/github/ltsopensource/handle/JobClientCompletedHandler.java @@ -0,0 +1,25 @@ +package com.github.ltsopensource.handle; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +import com.github.ltsopensource.core.commons.utils.CollectionUtils; +import com.github.ltsopensource.core.domain.JobResult; +import com.github.ltsopensource.jobclient.support.JobCompletedHandler; + +/** + * @author Robert HG (254963746@qq.com) on 4/17/16. + */ +public class JobClientCompletedHandler implements JobCompletedHandler { + + @Override + public void onComplete(List jobResults) { + // 任务执行反馈结果处理 + if (CollectionUtils.isNotEmpty(jobResults)) { + for (JobResult jobResult : jobResults) { + System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 任务执行完成:" + jobResult); + } + } + } +} diff --git a/lts-admin/src/main/java/com/github/ltsopensource/handle/JobHandle.java b/lts-admin/src/main/java/com/github/ltsopensource/handle/JobHandle.java new file mode 100644 index 000000000..e3bb6b167 --- /dev/null +++ b/lts-admin/src/main/java/com/github/ltsopensource/handle/JobHandle.java @@ -0,0 +1,122 @@ +package com.github.ltsopensource.handle; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; +import java.util.Random; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.github.ltsopensource.core.domain.Job; +import com.github.ltsopensource.jobclient.JobClient; +import com.github.ltsopensource.jobclient.domain.Response; +@Component +public class JobHandle { + public static String TASK_TRACKER_NODE_GROUP = "admin-task-tracker"; + @SuppressWarnings("rawtypes") + @Autowired + private JobClient jobClient; + /** + * @decription 实时任务 + * @author yi.zhang + * @time 2017年11月3日 上午11:23:15 + * @param url 请求URL + * @param params 请求参数 + * @return + */ + public Response handleRealtimeJob(String url,Map params){ + Job job = new Job(); + job.setTaskId("realtime_"+taskId()); + if(params!=null&¶ms.size()>0){ + job.setExtParams(params); + } + job.setParam("url", url); + job.setTaskTrackerNodeGroup(TASK_TRACKER_NODE_GROUP); + job.setNeedFeedback(true); + job.setReplaceOnExist(true); // 当任务队列中存在这个任务的时候,是否替换更新 + Response response = jobClient.submitJob(job); + return response; + } + /** + * @decription 重复任务 + * @author yi.zhang + * @time 2017年11月3日 上午11:24:11 + * @param url 请求URL + * @param params 请求参数 + * @param repeatCount 重复次数 + * @param intervalTime 重复间隔(单位:秒) + * @return + */ + public Response handleRepeatJob(String url,Map params,int repeatCount,long intervalTime){ + Job job = new Job(); + job.setTaskId("repeat_"+taskId()); + if(params!=null&¶ms.size()>0){ + job.setExtParams(params); + } + job.setParam("url", url); + job.setTaskTrackerNodeGroup(TASK_TRACKER_NODE_GROUP); + job.setNeedFeedback(true); + job.setReplaceOnExist(true); // 当任务队列中存在这个任务的时候,是否替换更新 + job.setRepeatCount(repeatCount); // 一共执行50次 + job.setRepeatInterval(intervalTime * 1000L); // 50s 执行一次 + Response response = jobClient.submitJob(job); + return response; + } + /** + * @decription 周期任务 + * @author yi.zhang + * @time 2017年11月3日 上午11:25:25 + * @param url 请求URL + * @param params 请求参数 + * @param cron 周期表达式(例如:0 0/1 * * * ?) + * @return + */ + public Response handleCronJob(String url,Map params,String cron){ + Job job = new Job(); + job.setTaskId("cron"+taskId()); + if(params!=null&¶ms.size()>0){ + job.setExtParams(params); + } + job.setParam("url", url); + job.setTaskTrackerNodeGroup(TASK_TRACKER_NODE_GROUP); // 执行要执行该任务的taskTracker的节点组名称 + job.setNeedFeedback(true); + job.setReplaceOnExist(true); // 当任务队列中存在这个任务的时候,是否替换更新 + job.setCronExpression("0 0/1 * * * ?"); + Response response = jobClient.submitJob(job); + return response; + } + /** + * @decription 定时任务 + * @author yi.zhang + * @time 2017年11月3日 上午11:26:43 + * @param url 请求URL + * @param params 请求参数 + * @param start 开始时间 + * @param time 定时时间(单位:秒) + * @return + */ + public Response handleTriggerTimeJob(String url,Map params,Date start,long time){ + Job job = new Job(); + job.setTaskId("trigger_"+taskId()); + if(params!=null&¶ms.size()>0){ + job.setExtParams(params); + } + if(start==null){ + start = new Date(); + } + job.setParam("url", url); + job.setTaskTrackerNodeGroup(TASK_TRACKER_NODE_GROUP); + job.setNeedFeedback(true); + job.setReplaceOnExist(true); // 当任务队列中存在这个任务的时候,是否替换更新 + job.setTriggerTime(start.getTime()+time * 1000L); // 1 小时之后执行 + Response response = jobClient.submitJob(job); + return response; + } + + private String taskId(){ + String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); + String taskId = time+new Random().nextInt(1000); + return taskId; + } +} diff --git a/lts-admin/src/main/java/com/github/ltsopensource/handle/TaskTrackerJobRunner.java b/lts-admin/src/main/java/com/github/ltsopensource/handle/TaskTrackerJobRunner.java new file mode 100644 index 000000000..fe2de32eb --- /dev/null +++ b/lts-admin/src/main/java/com/github/ltsopensource/handle/TaskTrackerJobRunner.java @@ -0,0 +1,38 @@ +package com.github.ltsopensource.handle; + +import com.github.ltsopensource.core.domain.Action; +import com.github.ltsopensource.core.domain.Job; +import com.github.ltsopensource.core.logger.Logger; +import com.github.ltsopensource.core.logger.LoggerFactory; +import com.github.ltsopensource.tasktracker.Result; +import com.github.ltsopensource.tasktracker.runner.JobContext; +import com.github.ltsopensource.tasktracker.runner.JobRunner; + +/** + * @author Robert HG (254963746@qq.com) on 4/17/16. + */ +public class TaskTrackerJobRunner implements JobRunner { + + private static final Logger logger = LoggerFactory.getLogger(TaskTrackerJobRunner.class); + + @Override + public Result run(JobContext ctx) throws Throwable { + try { +// BizLogger bizLogger = LtsLoggerFactory.getBizLogger(); +// BizLogger log = ctx.getBizLogger(); + Job job = ctx.getJob(); + // TODO 业务逻辑 + logger.info("Job Context:" + ctx); + // 会发送到 LTS (JobTracker上) + System.out.println("\n\n\n---------------------------------------------------------------------------------"); + System.out.println("---------------------------------------------------------------------------------"); + System.out.println("-admin-task-tracker--"+job.getTaskId()+"-->"+job.getTaskTrackerNodeGroup()+"-->"+job.getSubmitNodeGroup()); + System.out.println("---------------------------------------------------------------------------------"); + System.out.println("---------------------------------------------------------------------------------\n\n\n"); + } catch (Exception e) { + logger.info("Admin Run job failed!", e); + return new Result(Action.EXECUTE_FAILED, e.getMessage()); + } + return new Result(Action.EXECUTE_SUCCESS, "Admin Excute Success!"); + } +} diff --git a/lts-admin/src/main/resources/log4j.properties b/lts-admin/src/main/resources/log4j.properties index 096897efc..98916ff98 100644 --- a/lts-admin/src/main/resources/log4j.properties +++ b/lts-admin/src/main/resources/log4j.properties @@ -1,12 +1,14 @@ +log4j.rootLogger=INFO,CONSOLE,LOGFILE -log4j.rootLogger=INFO,stdout +log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender +log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout +log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}|%-5p|[%c{1}(%L)-->%M] -- %m%n +#log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}|%-5p| [%l] --- %m%n -log4j.appender.stdout.Threshold=INFO -log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n - -#log4j.logger.org.apache.zookeeper.ZooKeeper=WARN -#log4j.logger.org.apache.zookeeper.ClientCnxn=WARN -#log4j.logger.org.I0Itec.zkclient.ZkEventThread=WARN -#log4j.logger.org.I0Itec.zkclient.ZkClient=WARN \ No newline at end of file +log4j.appender.LOGFILE=org.apache.log4j.DailyRollingFileAppender +log4j.appender.LOGFILE.File=../logs/its.log +log4j.appender.logfile.encoding=UTF-8 +log4j.appender.LOGFILE.Append=false +log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout +log4j.appender.LOGFILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %l --- %m%n +log4j.appender.LOGFILE.File.DatePattern='.'yyyy-MM-dd'.log' \ No newline at end of file diff --git a/lts-admin/src/main/resources/lts-admin.cfg b/lts-admin/src/main/resources/lts-admin.cfg index 940ae355a..ad1197d05 100644 --- a/lts-admin/src/main/resources/lts-admin.cfg +++ b/lts-admin/src/main/resources/lts-admin.cfg @@ -7,7 +7,7 @@ registryAddress=zookeeper://127.0.0.1:2181 # registryAddress=redis://127.0.0.1:6379 # 集群名称 -clusterName=test_cluster +clusterName=css-vsim-web # zk客户端,可选值 zkclient, curator configs.zk.client=zkclient diff --git a/lts-admin/src/main/resources/lts-monitor.cfg b/lts-admin/src/main/resources/lts-monitor.cfg index fd7740009..d1f5d49f6 100644 --- a/lts-admin/src/main/resources/lts-monitor.cfg +++ b/lts-admin/src/main/resources/lts-monitor.cfg @@ -4,7 +4,7 @@ registryAddress=zookeeper://127.0.0.1:2181 # registryAddress=redis://127.0.0.1:6379 # 集群名称 -clusterName=test_cluster +clusterName=css-vsim-web # LTS业务日志, 可选值 mysql, mongo configs.job.logger=mysql diff --git a/lts-admin/src/main/resources/lts.properties b/lts-admin/src/main/resources/lts.properties new file mode 100644 index 000000000..5f766ea5e --- /dev/null +++ b/lts-admin/src/main/resources/lts.properties @@ -0,0 +1,25 @@ +#\u6ce8\u518c\u4e2d\u5fc3\u53ca\u96c6\u7fa4\u914d\u7f6e +lts.cluster.name=css-vsim-web +lts.job.fail.store=mapdb +lts.registry-address=zookeeper://127.0.0.1:2181 +#lts.registry-address=redis://127.0.0.1:6379 +#JobClient\u914d\u7f6e +lts.jobclient.node-group=admin-job-client +lts.jobclient.use-retry-client=true +#JobTracker\u914d\u7f6e{\u65e5\u5fd7\u8bb0\u5f55(mongo|mysql|console[\u9ed8\u8ba4]),\u961f\u5217\u5b58\u50a8(mongo|mysql[\u9ed8\u8ba4])} +lts.jobtracker.listen-port=35002 +lts.jobtracker.configs.job.logger=mongo +lts.jobtracker.configs.job.queue=mongo +lts.jobtracker.configs.jdbc.url=jdbc:mysql://127.0.0.1:3306/lts +lts.jobtracker.configs.jdbc.username=root +lts.jobtracker.configs.jdbc.password=root +lts.jobtracker.configs.mongo.addresses=127.0.0.1:27017 +lts.jobtracker.configs.mongo.database=lts +lts.jobtracker.configs.mongo.username= +lts.jobtracker.configs.mongo.password= + +#TaskTracker\u914d\u7f6e +lts.tasktracker.work-threads=64 +lts.tasktracker.node-group=admin-task-tracker +#lts.tasktracker.dispatch-runner.enable=true +#lts.tasktracker.dispatch-runner.shard-value=taskId \ No newline at end of file diff --git a/lts-admin/src/main/resources/spring-core.xml b/lts-admin/src/main/resources/spring-core.xml index e58afa990..f6799876f 100644 --- a/lts-admin/src/main/resources/spring-core.xml +++ b/lts-admin/src/main/resources/spring-core.xml @@ -34,4 +34,6 @@ + + \ No newline at end of file diff --git a/lts-admin/src/main/resources/spring-lts.xml b/lts-admin/src/main/resources/spring-lts.xml new file mode 100644 index 000000000..c39b21e99 --- /dev/null +++ b/lts-admin/src/main/resources/spring-lts.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + ${lts.job.fail.store} + + + + + + + + + + + + + ${lts.jobtracker.configs.job.logger} + ${lts.jobtracker.configs.job.queue} + ${lts.jobtracker.configs.jdbc.url} + ${lts.jobtracker.configs.jdbc.username} + ${lts.jobtracker.configs.jdbc.password} + ${lts.jobtracker.configs.mongo.addresses} + ${lts.jobtracker.configs.mongo.database} + ${lts.jobtracker.configs.mongo.username} + ${lts.jobtracker.configs.mongo.password} + + + + + + + + + + + + ${lts.job.fail.store} + + + + \ No newline at end of file diff --git a/lts-core/src/main/java/com/github/ltsopensource/biz/logger/mysql/MysqlJobLogger.java b/lts-core/src/main/java/com/github/ltsopensource/biz/logger/mysql/MysqlJobLogger.java index 810c07854..fcda2b110 100644 --- a/lts-core/src/main/java/com/github/ltsopensource/biz/logger/mysql/MysqlJobLogger.java +++ b/lts-core/src/main/java/com/github/ltsopensource/biz/logger/mysql/MysqlJobLogger.java @@ -14,8 +14,6 @@ import com.github.ltsopensource.store.jdbc.builder.SelectSql; import com.github.ltsopensource.store.jdbc.builder.WhereSql; import com.github.ltsopensource.store.jdbc.dbutils.JdbcTypeUtils; -import com.sun.tools.internal.ws.wsdl.document.soap.SOAPUse; - import java.util.List; /** diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-java/pom.xml b/lts-examples/lts-example-jobclient/lts-example-jobclient-java/pom.xml new file mode 100644 index 000000000..a900d9876 --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-java/pom.xml @@ -0,0 +1,14 @@ + + + + lts-example-jobclient + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + + lts-example-jobclient-java + + diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-java/src/main/java/com/github/ltsopensource/example/java/JobCompletedHandlerImpl.java b/lts-examples/lts-example-jobclient/lts-example-jobclient-java/src/main/java/com/github/ltsopensource/example/java/JobCompletedHandlerImpl.java new file mode 100644 index 000000000..16327037b --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-java/src/main/java/com/github/ltsopensource/example/java/JobCompletedHandlerImpl.java @@ -0,0 +1,25 @@ +package com.github.ltsopensource.example.java; + +import com.github.ltsopensource.core.commons.utils.CollectionUtils; +import com.github.ltsopensource.core.domain.JobResult; +import com.github.ltsopensource.jobclient.support.JobCompletedHandler; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * @author Robert HG (254963746@qq.com) on 4/17/16. + */ +public class JobCompletedHandlerImpl implements JobCompletedHandler { + + @Override + public void onComplete(List jobResults) { + // 任务执行反馈结果处理 + if (CollectionUtils.isNotEmpty(jobResults)) { + for (JobResult jobResult : jobResults) { + System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 任务执行完成:" + jobResult); + } + } + } +} diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-java/src/main/java/com/github/ltsopensource/example/java/Main.java b/lts-examples/lts-example-jobclient/lts-example-jobclient-java/src/main/java/com/github/ltsopensource/example/java/Main.java new file mode 100644 index 000000000..45d53d6f5 --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-java/src/main/java/com/github/ltsopensource/example/java/Main.java @@ -0,0 +1,89 @@ +package com.github.ltsopensource.example.java; + +import com.github.ltsopensource.core.commons.utils.DateUtils; +import com.github.ltsopensource.core.domain.Job; +import com.github.ltsopensource.jobclient.JobClient; +import com.github.ltsopensource.jobclient.JobClientBuilder; +import com.github.ltsopensource.jobclient.domain.Response; + +import java.util.Date; + +/** + * @author Robert HG (254963746@qq.com) on 4/17/16. + */ +public class Main { + + public static void main(String[] args) { + + // 方式1 +// JobClient jobClient = new RetryJobClient(); +// jobClient.setNodeGroup("test_jobClient"); +// jobClient.setClusterName("test_cluster"); +// jobClient.setRegistryAddress("zookeeper://127.0.0.1:2181"); +// jobClient.setJobCompletedHandler(new JobCompletedHandlerImpl()); +// jobClient.addConfig("job.fail.store", "mapdb"); +// jobClient.start(); + + // 方式2 + JobClient jobClient = new JobClientBuilder() + .setPropertiesConfigure("lts.properties") + .setJobCompletedHandler(new JobCompletedHandlerImpl()) + .build(); + + jobClient.start(); + + submitCronJob(jobClient); + submitRepeatJob(jobClient); + submitRealtimeJob(jobClient); + submitTriggerTimeJob(jobClient); + } + + private static void submitCronJob(JobClient jobClient) { + Job job = new Job(); + job.setTaskId("t_cron_555"); + job.setParam("shopId", "1122222221"); + job.setTaskTrackerNodeGroup("test_trade_TaskTracker"); // 执行要执行该任务的taskTracker的节点组名称 + job.setNeedFeedback(true); + job.setReplaceOnExist(true); // 当任务队列中存在这个任务的时候,是否替换更新 + job.setCronExpression("0 0/1 * * * ?"); + Response response = jobClient.submitJob(job); + System.out.println(response); + } + + private static void submitRepeatJob(JobClient jobClient) { + Job job = new Job(); + job.setTaskId("t_repeat_555"); + job.setParam("shopId", "1122222221"); + job.setTaskTrackerNodeGroup("test_trade_TaskTracker"); + job.setNeedFeedback(true); + job.setReplaceOnExist(true); // 当任务队列中存在这个任务的时候,是否替换更新 + job.setRepeatCount(50); // 一共执行50次 + job.setRepeatInterval(50 * 1000L); // 50s 执行一次 + Response response = jobClient.submitJob(job); + System.out.println(response); + } + + private static void submitRealtimeJob(JobClient jobClient) { + Job job = new Job(); + job.setTaskId("t_realtime_555"); + job.setParam("shopId", "1122222221"); + job.setTaskTrackerNodeGroup("test_trade_TaskTracker"); + job.setNeedFeedback(true); + job.setReplaceOnExist(true); // 当任务队列中存在这个任务的时候,是否替换更新 + Response response = jobClient.submitJob(job); + System.out.println(response); + } + + private static void submitTriggerTimeJob(JobClient jobClient) { + Job job = new Job(); + job.setTaskId("t_trigger_time_555"); + job.setParam("shopId", "1122222221"); + job.setTaskTrackerNodeGroup("test_trade_TaskTracker"); + job.setNeedFeedback(true); + job.setReplaceOnExist(true); // 当任务队列中存在这个任务的时候,是否替换更新 + job.setTriggerTime(DateUtils.addHour(new Date(), 1).getTime()); // 1 小时之后执行 + Response response = jobClient.submitJob(job); + System.out.println(response); + } + +} diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-java/src/main/java/com/github/ltsopensource/example/java/TestSubmit.java b/lts-examples/lts-example-jobclient/lts-example-jobclient-java/src/main/java/com/github/ltsopensource/example/java/TestSubmit.java new file mode 100644 index 000000000..385604928 --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-java/src/main/java/com/github/ltsopensource/example/java/TestSubmit.java @@ -0,0 +1,123 @@ +package com.github.ltsopensource.example.java; + +import com.github.ltsopensource.core.commons.utils.StringUtils; +import com.github.ltsopensource.core.domain.Job; +import com.github.ltsopensource.core.exception.JobSubmitException; +import com.github.ltsopensource.jobclient.JobClient; +import com.github.ltsopensource.jobclient.JobClientBuilder; +import com.github.ltsopensource.jobclient.domain.Response; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.text.ParseException; +import java.text.SimpleDateFormat; + +/** + * Created by hugui.hg on 4/23/16. + */ +public class TestSubmit { + + static JobClient jobClient; + + public static void main(String[] args) throws IOException { + // 方式2 + jobClient = new JobClientBuilder() + .setPropertiesConfigure("lts.properties") + .setJobCompletedHandler(new JobCompletedHandlerImpl()) + .build(); + + jobClient.start(); + + startConsole(); + } + + private static int mode = 2; + + public static void startConsole() throws IOException { + + BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in)); + + String help = "命令参数: \n" + + "\t1:cronExpression模式,如 0 0/1 * * * ?(一分钟执行一次), \n\t2:指定时间模式 yyyy-MM-dd HH:mm:ss,在执行时间模式下,如果字符串now,表示立即执行 \n" + + "\tquit:退出\n" + + "\thelp:帮助"; + System.out.println(help); + System.out.println("指定时间模式:"); + + Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { + @Override + public void run() { + jobClient.stop(); + } + })); + + String input; + while (!"quit".equals(input = buffer.readLine())) { + try { + if ("now".equals(input)) { + input = ""; + } + if ("help".equals(input)) { + System.out.println(help); + } else if ("1".equals(input)) { + mode = 1; + } else if ("2".equals(input)) { + mode = 2; + } else { + if (mode == 1) { + submitWithCronExpression(jobClient, input); + } else if (mode == 2) { + submitWithTrigger(jobClient, input); + } + } + + if (mode == 1) { + System.out.print("cronExpression模式:"); + } else if (mode == 2) { + System.out.print("指定时间模式:"); + } + + } catch (Exception e) { + System.out.println("输入错误"); + } + } + System.exit(0); + } + + public static void submitWithCronExpression(final JobClient jobClient, String cronExpression) throws ParseException, JobSubmitException { + Job job = new Job(); + // 必填,尽量taskId 有一定规律性,能让自己识别 + job.setTaskId(StringUtils.generateUUID()); + // 任务的参数,value必须为字符串 + job.setParam("shopId", "111"); + // 执行节点的group名称 + job.setTaskTrackerNodeGroup("test_trade_TaskTracker"); + // 是否接收执行反馈消息 jobClient.setJobFinishedHandler(new JobFinishedHandlerImpl()); 中接受 + job.setNeedFeedback(true); + // 这个是 cron expression 和 quartz 一样,可选 + job.setCronExpression(cronExpression); + // 这个是指定执行时间,可选 + // job.setTriggerTime(new Date()); + // 当 cronExpression 和 triggerTime 都不设置的时候,默认是立即执行任务 + // response 返回提交成功还是失败 + Response response = jobClient.submitJob(job); + + + System.out.println(response); + } + + public static void submitWithTrigger(final JobClient jobClient, String triggerTime) throws ParseException, JobSubmitException { + Job job = new Job(); + job.setTaskId(StringUtils.generateUUID()); + job.setParam("shopId", "111"); + job.setMaxRetryTimes(5); + job.setTaskTrackerNodeGroup("test_trade_TaskTracker"); + job.setNeedFeedback(true); + if (triggerTime != null && !"".equals(triggerTime.trim())) { + job.setTriggerTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(triggerTime).getTime()); + } + Response response = jobClient.submitJob(job); + System.out.println(response); + } +} diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-java/src/main/resources/log4j.properties b/lts-examples/lts-example-jobclient/lts-example-jobclient-java/src/main/resources/log4j.properties new file mode 100644 index 000000000..a98c1d1d2 --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-java/src/main/resources/log4j.properties @@ -0,0 +1,7 @@ + +log4j.rootLogger=INFO,stdout + +log4j.appender.stdout.Threshold=INFO +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d [%t] (%F:%L) %-5p %c %x - %m%n \ No newline at end of file diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-java/src/main/resources/lts.properties b/lts-examples/lts-example-jobclient/lts-example-jobclient-java/src/main/resources/lts.properties new file mode 100644 index 000000000..c30ce6897 --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-java/src/main/resources/lts.properties @@ -0,0 +1,12 @@ +lts.jobclient.cluster-name=test_cluster +lts.jobclient.registry-address=zookeeper://127.0.0.1:2181 +lts.jobclient.node-group=test_jobClient +lts.jobclient.use-retry-client=true +lts.jobclient.configs.job.fail.store=mapdb + + +#LTS.JOBCLIENT.CLUSTER-NAME=test_cluster +#LTS.JOBCLIENT.REGISTRY-ADDRESS=zookeeper://127.0.0.1:2181 +#LTS.JOBCLIENT.NODE-GROUP=test_jobClient +#LTS.JOBCLIENT.USE-RETRY-CLIENT=true +#LTS.JOBCLIENT.CONFIGS.job.fail.store=mapdb diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-annotation/pom.xml b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-annotation/pom.xml new file mode 100644 index 000000000..43bb5d690 --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-annotation/pom.xml @@ -0,0 +1,37 @@ + + + + lts-example-jobclient + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + + lts-example-jobclient-spring-annotation + + + + org.springframework + spring-core + ${springframework.version} + + + org.springframework + spring-beans + ${springframework.version} + + + org.springframework + spring-context + ${springframework.version} + + + org.springframework + spring-context-support + ${springframework.version} + + + + diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-annotation/src/main/java/com/github/ltsopensource/example/JobClientConfig.java b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-annotation/src/main/java/com/github/ltsopensource/example/JobClientConfig.java new file mode 100644 index 000000000..ca9ad332b --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-annotation/src/main/java/com/github/ltsopensource/example/JobClientConfig.java @@ -0,0 +1,22 @@ +package com.github.ltsopensource.example; + +import com.github.ltsopensource.jobclient.JobClient; +import com.github.ltsopensource.spring.JobClientFactoryBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author Robert HG (254963746@qq.com) on 4/22/16. + */ +@Configuration +public class JobClientConfig { + + @Bean(name = "jobClient") + public JobClient getJobClient() throws Exception { + JobClientFactoryBean factoryBean = new JobClientFactoryBean(); + factoryBean.setLocations("lts.properties"); + factoryBean.afterPropertiesSet(); + factoryBean.start(); + return factoryBean.getObject(); + } +} diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-annotation/src/main/java/com/github/ltsopensource/example/JobCompletedHandlerImpl.java b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-annotation/src/main/java/com/github/ltsopensource/example/JobCompletedHandlerImpl.java new file mode 100644 index 000000000..b4b197468 --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-annotation/src/main/java/com/github/ltsopensource/example/JobCompletedHandlerImpl.java @@ -0,0 +1,25 @@ +package com.github.ltsopensource.example; + +import com.github.ltsopensource.core.commons.utils.CollectionUtils; +import com.github.ltsopensource.core.domain.JobResult; +import com.github.ltsopensource.jobclient.support.JobCompletedHandler; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * @author Robert HG (254963746@qq.com) on 4/17/16. + */ +public class JobCompletedHandlerImpl implements JobCompletedHandler { + + @Override + public void onComplete(List jobResults) { + // 任务执行反馈结果处理 + if (CollectionUtils.isNotEmpty(jobResults)) { + for (JobResult jobResult : jobResults) { + System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 任务执行完成:" + jobResult); + } + } + } +} diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-annotation/src/main/java/com/github/ltsopensource/example/Main.java b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-annotation/src/main/java/com/github/ltsopensource/example/Main.java new file mode 100644 index 000000000..63848eaee --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-annotation/src/main/java/com/github/ltsopensource/example/Main.java @@ -0,0 +1,29 @@ +package com.github.ltsopensource.example; + +import com.github.ltsopensource.core.domain.Job; +import com.github.ltsopensource.jobclient.JobClient; +import com.github.ltsopensource.jobclient.domain.Response; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +/** + * @author Robert HG (254963746@qq.com) on 4/22/16. + */ +public class Main { + + public static void main(String[] args) { + ApplicationContext context = new ClassPathXmlApplicationContext("/lts-jobclient.xml"); + + JobClient jobClient = (JobClient) context.getBean("jobClient"); + + Job job = new Job(); + job.setTaskId("t_realtime_5556666"); + job.setParam("shopId", "1122222221"); + job.setTaskTrackerNodeGroup("test_trade_TaskTracker"); + job.setNeedFeedback(true); + job.setReplaceOnExist(true); // 当任务队列中存在这个任务的时候,是否替换更新 + Response response = jobClient.submitJob(job); + System.out.println(response); + } + +} diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-annotation/src/main/resources/log4j.properties b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-annotation/src/main/resources/log4j.properties new file mode 100644 index 000000000..a98c1d1d2 --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-annotation/src/main/resources/log4j.properties @@ -0,0 +1,7 @@ + +log4j.rootLogger=INFO,stdout + +log4j.appender.stdout.Threshold=INFO +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d [%t] (%F:%L) %-5p %c %x - %m%n \ No newline at end of file diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-annotation/src/main/resources/lts-jobclient.xml b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-annotation/src/main/resources/lts-jobclient.xml new file mode 100644 index 000000000..341024d3b --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-annotation/src/main/resources/lts-jobclient.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-annotation/src/main/resources/lts.properties b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-annotation/src/main/resources/lts.properties new file mode 100644 index 000000000..c30ce6897 --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-annotation/src/main/resources/lts.properties @@ -0,0 +1,12 @@ +lts.jobclient.cluster-name=test_cluster +lts.jobclient.registry-address=zookeeper://127.0.0.1:2181 +lts.jobclient.node-group=test_jobClient +lts.jobclient.use-retry-client=true +lts.jobclient.configs.job.fail.store=mapdb + + +#LTS.JOBCLIENT.CLUSTER-NAME=test_cluster +#LTS.JOBCLIENT.REGISTRY-ADDRESS=zookeeper://127.0.0.1:2181 +#LTS.JOBCLIENT.NODE-GROUP=test_jobClient +#LTS.JOBCLIENT.USE-RETRY-CLIENT=true +#LTS.JOBCLIENT.CONFIGS.job.fail.store=mapdb diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-xml/pom.xml b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-xml/pom.xml new file mode 100644 index 000000000..ca1757804 --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-xml/pom.xml @@ -0,0 +1,37 @@ + + + + lts-example-jobclient + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + + lts-example-jobclient-spring-xml + + + + org.springframework + spring-core + ${springframework.version} + + + org.springframework + spring-beans + ${springframework.version} + + + org.springframework + spring-context + ${springframework.version} + + + org.springframework + spring-context-support + ${springframework.version} + + + + diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-xml/src/main/java/com/github/ltsopensource/example/spring/JobCompletedHandlerImpl.java b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-xml/src/main/java/com/github/ltsopensource/example/spring/JobCompletedHandlerImpl.java new file mode 100644 index 000000000..65ba9a3b8 --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-xml/src/main/java/com/github/ltsopensource/example/spring/JobCompletedHandlerImpl.java @@ -0,0 +1,25 @@ +package com.github.ltsopensource.example.spring; + +import com.github.ltsopensource.core.commons.utils.CollectionUtils; +import com.github.ltsopensource.core.domain.JobResult; +import com.github.ltsopensource.jobclient.support.JobCompletedHandler; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * @author Robert HG (254963746@qq.com) on 4/17/16. + */ +public class JobCompletedHandlerImpl implements JobCompletedHandler { + + @Override + public void onComplete(List jobResults) { + // 任务执行反馈结果处理 + if (CollectionUtils.isNotEmpty(jobResults)) { + for (JobResult jobResult : jobResults) { + System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 任务执行完成:" + jobResult); + } + } + } +} diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-xml/src/main/java/com/github/ltsopensource/example/spring/Main.java b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-xml/src/main/java/com/github/ltsopensource/example/spring/Main.java new file mode 100644 index 000000000..cc4cb1723 --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-xml/src/main/java/com/github/ltsopensource/example/spring/Main.java @@ -0,0 +1,29 @@ +package com.github.ltsopensource.example.spring; + +import com.github.ltsopensource.core.domain.Job; +import com.github.ltsopensource.jobclient.JobClient; +import com.github.ltsopensource.jobclient.domain.Response; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +/** + * @author Robert HG (254963746@qq.com) on 4/18/16. + */ +public class Main { + + public static void main(String[] args) { + ApplicationContext context = new ClassPathXmlApplicationContext("/lts-jobclient.xml"); + + JobClient jobClient = (JobClient) context.getBean("jobClient"); + + Job job = new Job(); + job.setTaskId("t_realtime_5556666"); + job.setParam("shopId", "1122222221"); + job.setTaskTrackerNodeGroup("test_trade_TaskTracker"); + job.setNeedFeedback(true); + job.setReplaceOnExist(true); // 当任务队列中存在这个任务的时候,是否替换更新 + Response response = jobClient.submitJob(job); + System.out.println(response); + } + +} diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-xml/src/main/resources/log4j.properties b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-xml/src/main/resources/log4j.properties new file mode 100644 index 000000000..a98c1d1d2 --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-xml/src/main/resources/log4j.properties @@ -0,0 +1,7 @@ + +log4j.rootLogger=INFO,stdout + +log4j.appender.stdout.Threshold=INFO +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d [%t] (%F:%L) %-5p %c %x - %m%n \ No newline at end of file diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-xml/src/main/resources/lts-jobclient.xml b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-xml/src/main/resources/lts-jobclient.xml new file mode 100644 index 000000000..718965b3d --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-xml/src/main/resources/lts-jobclient.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-xml/src/main/resources/lts.properties b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-xml/src/main/resources/lts.properties new file mode 100644 index 000000000..c30ce6897 --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-spring-xml/src/main/resources/lts.properties @@ -0,0 +1,12 @@ +lts.jobclient.cluster-name=test_cluster +lts.jobclient.registry-address=zookeeper://127.0.0.1:2181 +lts.jobclient.node-group=test_jobClient +lts.jobclient.use-retry-client=true +lts.jobclient.configs.job.fail.store=mapdb + + +#LTS.JOBCLIENT.CLUSTER-NAME=test_cluster +#LTS.JOBCLIENT.REGISTRY-ADDRESS=zookeeper://127.0.0.1:2181 +#LTS.JOBCLIENT.NODE-GROUP=test_jobClient +#LTS.JOBCLIENT.USE-RETRY-CLIENT=true +#LTS.JOBCLIENT.CONFIGS.job.fail.store=mapdb diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-springboot/pom.xml b/lts-examples/lts-example-jobclient/lts-example-jobclient-springboot/pom.xml new file mode 100644 index 000000000..fc51bca90 --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-springboot/pom.xml @@ -0,0 +1,24 @@ + + + + lts-example-jobclient + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + lts-example-jobclient-springboot + + + + org.springframework.boot + spring-boot + + + org.springframework.boot + spring-boot-autoconfigure + + + + diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-springboot/src/main/java/com/github/ltsopensource/example/springboot/Application.java b/lts-examples/lts-example-jobclient/lts-example-jobclient-springboot/src/main/java/com/github/ltsopensource/example/springboot/Application.java new file mode 100644 index 000000000..d899956a5 --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-springboot/src/main/java/com/github/ltsopensource/example/springboot/Application.java @@ -0,0 +1,20 @@ +package com.github.ltsopensource.example.springboot; + +import com.github.ltsopensource.spring.boot.annotation.EnableJobClient; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +/** + * @author Robert HG (254963746@qq.com) on 4/9/16. + */ +@SpringBootApplication +@EnableJobClient +@ComponentScan("com.github.ltsopensource.example") +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-springboot/src/main/java/com/github/ltsopensource/example/springboot/JobClientReferenceBean.java b/lts-examples/lts-example-jobclient/lts-example-jobclient-springboot/src/main/java/com/github/ltsopensource/example/springboot/JobClientReferenceBean.java new file mode 100644 index 000000000..2ecd8ae74 --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-springboot/src/main/java/com/github/ltsopensource/example/springboot/JobClientReferenceBean.java @@ -0,0 +1,38 @@ +package com.github.ltsopensource.example.springboot; + +import com.github.ltsopensource.core.domain.Job; +import com.github.ltsopensource.jobclient.JobClient; +import com.github.ltsopensource.jobclient.domain.Response; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @author Robert HG (254963746@qq.com) on 4/9/16. + */ +@Component +public class JobClientReferenceBean implements InitializingBean { + + /** + * 自己的业务类,就可以这样引用了 + */ + @Autowired + private JobClient jobClient; + + @Override + public void afterPropertiesSet() throws Exception { + + // 这里模拟提交任务 + + Job job = new Job(); + job.setTaskId("t_555"); + job.setParam("shopId", "1122222221"); + job.setTaskTrackerNodeGroup("test_trade_TaskTracker"); + job.setNeedFeedback(true); + job.setReplaceOnExist(true); // 当任务队列中存在这个任务的时候,是否替换更新 +// job.setCronExpression("0 0/1 * * * ?"); +// job.setTriggerTime(DateUtils.addDay(new Date(), 1)); + Response response = jobClient.submitJob(job); + System.out.println(response); + } +} diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-springboot/src/main/java/com/github/ltsopensource/example/springboot/JobCompletedHandlerImpl.java b/lts-examples/lts-example-jobclient/lts-example-jobclient-springboot/src/main/java/com/github/ltsopensource/example/springboot/JobCompletedHandlerImpl.java new file mode 100644 index 000000000..1379896d4 --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-springboot/src/main/java/com/github/ltsopensource/example/springboot/JobCompletedHandlerImpl.java @@ -0,0 +1,27 @@ +package com.github.ltsopensource.example.springboot; + +import com.github.ltsopensource.core.commons.utils.CollectionUtils; +import com.github.ltsopensource.core.domain.JobResult; +import com.github.ltsopensource.jobclient.support.JobCompletedHandler; +import com.github.ltsopensource.spring.boot.annotation.JobCompletedHandler4JobClient; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * @author Robert HG (254963746@qq.com) on 4/9/16. + */ +// 增加这个注解, 即可作为任务执行结果反馈回调接口(也可以不使用) +@JobCompletedHandler4JobClient +public class JobCompletedHandlerImpl implements JobCompletedHandler { + @Override + public void onComplete(List jobResults) { + // 任务执行反馈结果处理 + if (CollectionUtils.isNotEmpty(jobResults)) { + for (JobResult jobResult : jobResults) { + System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 任务执行完成:" + jobResult); + } + } + } +} diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-springboot/src/main/java/com/github/ltsopensource/example/springboot/MasterNodeChangeListener.java b/lts-examples/lts-example-jobclient/lts-example-jobclient-springboot/src/main/java/com/github/ltsopensource/example/springboot/MasterNodeChangeListener.java new file mode 100644 index 000000000..5883bbcb0 --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-springboot/src/main/java/com/github/ltsopensource/example/springboot/MasterNodeChangeListener.java @@ -0,0 +1,31 @@ +package com.github.ltsopensource.example.springboot; + +import com.github.ltsopensource.core.cluster.Node; +import com.github.ltsopensource.core.commons.utils.StringUtils; +import com.github.ltsopensource.core.listener.MasterChangeListener; +import com.github.ltsopensource.core.logger.Logger; +import com.github.ltsopensource.core.logger.LoggerFactory; +import com.github.ltsopensource.spring.boot.annotation.MasterNodeListener; + +/** + * @author Robert HG (254963746@qq.com) on 4/9/16. + */ +@MasterNodeListener +public class MasterNodeChangeListener implements MasterChangeListener { + + private static final Logger LOGGER = LoggerFactory.getLogger(MasterNodeChangeListener.class); + + /** + * @param master master节点 + * @param isMaster 表示当前节点是不是master节点 + */ + @Override + public void change(Node master, boolean isMaster) { + // 一个节点组master节点变化后的处理 , 譬如我多个JobClient, 但是有些事情只想只有一个节点能做。 + if (isMaster) { + LOGGER.info("我变成了节点组中的master节点了, 恭喜, 我要放大招了"); + } else { + LOGGER.info(StringUtils.format("master节点变成了{},不是我,我不能放大招,要猥琐", master)); + } + } +} diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-springboot/src/main/resources/application.properties b/lts-examples/lts-example-jobclient/lts-example-jobclient-springboot/src/main/resources/application.properties new file mode 100644 index 000000000..92b94cc6c --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-springboot/src/main/resources/application.properties @@ -0,0 +1,5 @@ +lts.jobclient.cluster-name=test_cluster +lts.jobclient.registry-address=zookeeper://127.0.0.1:2181 +lts.jobclient.node-group=test_jobClient +lts.jobclient.use-retry-client=true +lts.jobclient.configs.job.fail.store=mapdb \ No newline at end of file diff --git a/lts-examples/lts-example-jobclient/lts-example-jobclient-springboot/src/main/resources/log4j.properties b/lts-examples/lts-example-jobclient/lts-example-jobclient-springboot/src/main/resources/log4j.properties new file mode 100644 index 000000000..a98c1d1d2 --- /dev/null +++ b/lts-examples/lts-example-jobclient/lts-example-jobclient-springboot/src/main/resources/log4j.properties @@ -0,0 +1,7 @@ + +log4j.rootLogger=INFO,stdout + +log4j.appender.stdout.Threshold=INFO +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d [%t] (%F:%L) %-5p %c %x - %m%n \ No newline at end of file diff --git a/lts-examples/lts-example-jobclient/pom.xml b/lts-examples/lts-example-jobclient/pom.xml new file mode 100644 index 000000000..025e75975 --- /dev/null +++ b/lts-examples/lts-example-jobclient/pom.xml @@ -0,0 +1,51 @@ + + + + lts-parent + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + pom + + lts-example-jobclient-springboot + lts-example-jobclient-spring-xml + lts-example-jobclient-java + lts-example-jobclient-spring-annotation + + lts-example-jobclient + + + + com.github.ltsopensource + lts + + + org.javassist + javassist + + + log4j + log4j + + + com.github.sgroschupf + zkclient + + + io.netty + netty-all + + + com.alibaba + fastjson + + + org.mapdb + mapdb + + + + diff --git a/lts-examples/lts-example-jobtracker/lts-example-jobtracker-java/pom.xml b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-java/pom.xml new file mode 100644 index 000000000..5450cffaa --- /dev/null +++ b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-java/pom.xml @@ -0,0 +1,15 @@ + + + + lts-example-jobtracker + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + + lts-example-jobtracker-java + + + diff --git a/lts-examples/lts-example-jobtracker/lts-example-jobtracker-java/src/main/java/com/github/ltsopensource/example/java/Main.java b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-java/src/main/java/com/github/ltsopensource/example/java/Main.java new file mode 100644 index 000000000..2b0d52282 --- /dev/null +++ b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-java/src/main/java/com/github/ltsopensource/example/java/Main.java @@ -0,0 +1,43 @@ +package com.github.ltsopensource.example.java; + +import com.github.ltsopensource.jobtracker.JobTracker; +import com.github.ltsopensource.jobtracker.JobTrackerBuilder; + +/** + * @author Robert HG (254963746@qq.com) on 4/17/16. + */ +public class Main { + + public static void main(String[] args) { +// final JobTracker jobTracker = new JobTracker(); +// // 节点信息配置 +// jobTracker.setRegistryAddress("zookeeper://127.0.0.1:2181"); +//// jobTracker.setRegistryAddress("redis://127.0.0.1:6379"); +// jobTracker.setListenPort(35001); // 默认 35001 +// jobTracker.setClusterName("test_cluster"); +// +//// // 设置业务日志记录 mysql +//// jobTracker.addConfig("job.logger", "mysql"); +//// // 任务队列用mysql +//// jobTracker.addConfig("job.queue", "mysql"); +// // mysql 配置 +// jobTracker.addConfig("jdbc.url", "jdbc:mysql://127.0.0.1:3306/lts"); +// jobTracker.addConfig("jdbc.username", "root"); +// jobTracker.addConfig("jdbc.password", "root"); + + final JobTracker jobTracker = new JobTrackerBuilder() + .setPropertiesConfigure("lts.properties") + .build(); + + // 启动节点 + jobTracker.start(); + + Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { + @Override + public void run() { + jobTracker.stop(); + } + })); + } + +} diff --git a/lts-examples/lts-example-jobtracker/lts-example-jobtracker-java/src/main/resources/log4j.properties b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-java/src/main/resources/log4j.properties new file mode 100644 index 000000000..a98c1d1d2 --- /dev/null +++ b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-java/src/main/resources/log4j.properties @@ -0,0 +1,7 @@ + +log4j.rootLogger=INFO,stdout + +log4j.appender.stdout.Threshold=INFO +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d [%t] (%F:%L) %-5p %c %x - %m%n \ No newline at end of file diff --git a/lts-examples/lts-example-jobtracker/lts-example-jobtracker-java/src/main/resources/lts.properties b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-java/src/main/resources/lts.properties new file mode 100644 index 000000000..fe5439a69 --- /dev/null +++ b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-java/src/main/resources/lts.properties @@ -0,0 +1,8 @@ +lts.jobtracker.cluster-name=test_cluster +lts.jobtracker.listen-port=35001 +lts.jobtracker.registry-address=zookeeper://127.0.0.1:2181 +lts.jobtracker.configs.job.logger=mysql +lts.jobtracker.configs.job.queue=mysql +lts.jobtracker.configs.jdbc.url=jdbc:mysql://127.0.0.1:3306/lts +lts.jobtracker.configs.jdbc.username=root +lts.jobtracker.configs.jdbc.password=root diff --git a/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-annotaion/pom.xml b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-annotaion/pom.xml new file mode 100644 index 000000000..8384f72cc --- /dev/null +++ b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-annotaion/pom.xml @@ -0,0 +1,37 @@ + + + + lts-example-jobtracker + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + + lts-example-jobtracker-spring-annotaion + + + + org.springframework + spring-core + ${springframework.version} + + + org.springframework + spring-beans + ${springframework.version} + + + org.springframework + spring-context + ${springframework.version} + + + org.springframework + spring-context-support + ${springframework.version} + + + + diff --git a/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-annotaion/src/main/java/com/github/ltsopensource/example/JobTrackerConfig.java b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-annotaion/src/main/java/com/github/ltsopensource/example/JobTrackerConfig.java new file mode 100644 index 000000000..8b9cd52ec --- /dev/null +++ b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-annotaion/src/main/java/com/github/ltsopensource/example/JobTrackerConfig.java @@ -0,0 +1,23 @@ +package com.github.ltsopensource.example; + +import com.github.ltsopensource.jobtracker.JobTracker; +import com.github.ltsopensource.spring.JobTrackerFactoryBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author Robert HG (254963746@qq.com) on 4/22/16. + */ +@Configuration +public class JobTrackerConfig { + + @Bean(name = "jobTracker") + public JobTracker getJobTracker() throws Exception { + JobTrackerFactoryBean factoryBean = new JobTrackerFactoryBean(); + factoryBean.setLocations("lts.properties"); + factoryBean.afterPropertiesSet(); + factoryBean.start(); + return factoryBean.getObject(); + } + +} diff --git a/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-annotaion/src/main/java/com/github/ltsopensource/example/Main.java b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-annotaion/src/main/java/com/github/ltsopensource/example/Main.java new file mode 100644 index 000000000..c4b96b5b3 --- /dev/null +++ b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-annotaion/src/main/java/com/github/ltsopensource/example/Main.java @@ -0,0 +1,14 @@ +package com.github.ltsopensource.example; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +/** + * @author Robert HG (254963746@qq.com) on 4/22/16. + */ +public class Main { + + public static void main(String[] args) { + ApplicationContext context = new ClassPathXmlApplicationContext("/lts-jobtracker.xml"); + } +} diff --git a/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-annotaion/src/main/resources/log4j.properties b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-annotaion/src/main/resources/log4j.properties new file mode 100644 index 000000000..a98c1d1d2 --- /dev/null +++ b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-annotaion/src/main/resources/log4j.properties @@ -0,0 +1,7 @@ + +log4j.rootLogger=INFO,stdout + +log4j.appender.stdout.Threshold=INFO +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d [%t] (%F:%L) %-5p %c %x - %m%n \ No newline at end of file diff --git a/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-annotaion/src/main/resources/lts-jobtracker.xml b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-annotaion/src/main/resources/lts-jobtracker.xml new file mode 100644 index 000000000..341024d3b --- /dev/null +++ b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-annotaion/src/main/resources/lts-jobtracker.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-annotaion/src/main/resources/lts.properties b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-annotaion/src/main/resources/lts.properties new file mode 100644 index 000000000..fe5439a69 --- /dev/null +++ b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-annotaion/src/main/resources/lts.properties @@ -0,0 +1,8 @@ +lts.jobtracker.cluster-name=test_cluster +lts.jobtracker.listen-port=35001 +lts.jobtracker.registry-address=zookeeper://127.0.0.1:2181 +lts.jobtracker.configs.job.logger=mysql +lts.jobtracker.configs.job.queue=mysql +lts.jobtracker.configs.jdbc.url=jdbc:mysql://127.0.0.1:3306/lts +lts.jobtracker.configs.jdbc.username=root +lts.jobtracker.configs.jdbc.password=root diff --git a/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-xml/pom.xml b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-xml/pom.xml new file mode 100644 index 000000000..8278ecc8c --- /dev/null +++ b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-xml/pom.xml @@ -0,0 +1,37 @@ + + + + lts-example-jobtracker + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + + lts-example-jobtracker-spring-xml + + + org.springframework + spring-core + ${springframework.version} + + + org.springframework + spring-beans + ${springframework.version} + + + org.springframework + spring-context + ${springframework.version} + + + org.springframework + spring-context-support + ${springframework.version} + + + + + diff --git a/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-xml/src/main/java/com/github/ltsopensource/example/spring/Main.java b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-xml/src/main/java/com/github/ltsopensource/example/spring/Main.java new file mode 100644 index 000000000..cbdcebb57 --- /dev/null +++ b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-xml/src/main/java/com/github/ltsopensource/example/spring/Main.java @@ -0,0 +1,15 @@ +package com.github.ltsopensource.example.spring; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +/** + * @author Robert HG (254963746@qq.com) on 4/18/16. + */ +public class Main { + + public static void main(String[] args) { + ApplicationContext context = new ClassPathXmlApplicationContext("/lts-jobtracker.xml"); + } + +} diff --git a/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-xml/src/main/resources/log4j.properties b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-xml/src/main/resources/log4j.properties new file mode 100644 index 000000000..a98c1d1d2 --- /dev/null +++ b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-xml/src/main/resources/log4j.properties @@ -0,0 +1,7 @@ + +log4j.rootLogger=INFO,stdout + +log4j.appender.stdout.Threshold=INFO +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d [%t] (%F:%L) %-5p %c %x - %m%n \ No newline at end of file diff --git a/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-xml/src/main/resources/lts-jobtracker.xml b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-xml/src/main/resources/lts-jobtracker.xml new file mode 100644 index 000000000..2bc07f600 --- /dev/null +++ b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-spring-xml/src/main/resources/lts-jobtracker.xml @@ -0,0 +1,26 @@ + + + + + + + + + + mysql + mysql + jdbc:mysql://127.0.0.1:3306/lts + root + root + + + + + \ No newline at end of file diff --git a/lts-examples/lts-example-jobtracker/lts-example-jobtracker-springboot/pom.xml b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-springboot/pom.xml new file mode 100644 index 000000000..1b25461cf --- /dev/null +++ b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-springboot/pom.xml @@ -0,0 +1,25 @@ + + + + lts-example-jobtracker + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + + lts-example-jobtracker-springboot + + + + org.springframework.boot + spring-boot + + + org.springframework.boot + spring-boot-autoconfigure + + + + diff --git a/lts-examples/lts-example-jobtracker/lts-example-jobtracker-springboot/src/main/java/com/github/ltsopensource/example/springboot/Application.java b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-springboot/src/main/java/com/github/ltsopensource/example/springboot/Application.java new file mode 100644 index 000000000..a94204fcf --- /dev/null +++ b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-springboot/src/main/java/com/github/ltsopensource/example/springboot/Application.java @@ -0,0 +1,20 @@ +package com.github.ltsopensource.example.springboot; + +import com.github.ltsopensource.spring.boot.annotation.EnableJobTracker; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +/** + * @author Robert HG (254963746@qq.com) on 4/9/16. + */ +@SpringBootApplication +@EnableJobTracker +@ComponentScan("com.github.ltsopensource.example") +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/lts-examples/lts-example-jobtracker/lts-example-jobtracker-springboot/src/main/java/com/github/ltsopensource/example/springboot/MasterNodeChangeListener.java b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-springboot/src/main/java/com/github/ltsopensource/example/springboot/MasterNodeChangeListener.java new file mode 100644 index 000000000..5883bbcb0 --- /dev/null +++ b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-springboot/src/main/java/com/github/ltsopensource/example/springboot/MasterNodeChangeListener.java @@ -0,0 +1,31 @@ +package com.github.ltsopensource.example.springboot; + +import com.github.ltsopensource.core.cluster.Node; +import com.github.ltsopensource.core.commons.utils.StringUtils; +import com.github.ltsopensource.core.listener.MasterChangeListener; +import com.github.ltsopensource.core.logger.Logger; +import com.github.ltsopensource.core.logger.LoggerFactory; +import com.github.ltsopensource.spring.boot.annotation.MasterNodeListener; + +/** + * @author Robert HG (254963746@qq.com) on 4/9/16. + */ +@MasterNodeListener +public class MasterNodeChangeListener implements MasterChangeListener { + + private static final Logger LOGGER = LoggerFactory.getLogger(MasterNodeChangeListener.class); + + /** + * @param master master节点 + * @param isMaster 表示当前节点是不是master节点 + */ + @Override + public void change(Node master, boolean isMaster) { + // 一个节点组master节点变化后的处理 , 譬如我多个JobClient, 但是有些事情只想只有一个节点能做。 + if (isMaster) { + LOGGER.info("我变成了节点组中的master节点了, 恭喜, 我要放大招了"); + } else { + LOGGER.info(StringUtils.format("master节点变成了{},不是我,我不能放大招,要猥琐", master)); + } + } +} diff --git a/lts-examples/lts-example-jobtracker/lts-example-jobtracker-springboot/src/main/resources/application.properties b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-springboot/src/main/resources/application.properties new file mode 100644 index 000000000..fe5439a69 --- /dev/null +++ b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-springboot/src/main/resources/application.properties @@ -0,0 +1,8 @@ +lts.jobtracker.cluster-name=test_cluster +lts.jobtracker.listen-port=35001 +lts.jobtracker.registry-address=zookeeper://127.0.0.1:2181 +lts.jobtracker.configs.job.logger=mysql +lts.jobtracker.configs.job.queue=mysql +lts.jobtracker.configs.jdbc.url=jdbc:mysql://127.0.0.1:3306/lts +lts.jobtracker.configs.jdbc.username=root +lts.jobtracker.configs.jdbc.password=root diff --git a/lts-examples/lts-example-jobtracker/lts-example-jobtracker-springboot/src/main/resources/log4j.properties b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-springboot/src/main/resources/log4j.properties new file mode 100644 index 000000000..a98c1d1d2 --- /dev/null +++ b/lts-examples/lts-example-jobtracker/lts-example-jobtracker-springboot/src/main/resources/log4j.properties @@ -0,0 +1,7 @@ + +log4j.rootLogger=INFO,stdout + +log4j.appender.stdout.Threshold=INFO +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d [%t] (%F:%L) %-5p %c %x - %m%n \ No newline at end of file diff --git a/lts-examples/lts-example-jobtracker/pom.xml b/lts-examples/lts-example-jobtracker/pom.xml new file mode 100644 index 000000000..5329338e2 --- /dev/null +++ b/lts-examples/lts-example-jobtracker/pom.xml @@ -0,0 +1,55 @@ + + + + lts-examples + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + lts-example-jobtracker + pom + + lts-example-jobtracker-springboot + lts-example-jobtracker-java + lts-example-jobtracker-spring-xml + lts-example-jobtracker-spring-annotaion + + + + + com.github.ltsopensource + lts + + + org.javassist + javassist + + + log4j + log4j + + + com.github.sgroschupf + zkclient + + + io.netty + netty-all + + + mysql + mysql-connector-java + + + com.alibaba + druid + + + com.alibaba + fastjson + + + + diff --git a/lts-examples/lts-example-monitor/lts-example-monitor-springboot/pom.xml b/lts-examples/lts-example-monitor/lts-example-monitor-springboot/pom.xml new file mode 100644 index 000000000..9448e580e --- /dev/null +++ b/lts-examples/lts-example-monitor/lts-example-monitor-springboot/pom.xml @@ -0,0 +1,27 @@ + + + + lts-example-monitor + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + + lts-example-monitor-springboot + + + + + org.springframework.boot + spring-boot + + + org.springframework.boot + spring-boot-autoconfigure + + + + + diff --git a/lts-examples/lts-example-monitor/lts-example-monitor-springboot/src/main/java/com/github/ltsopensource/example/springboot/Application.java b/lts-examples/lts-example-monitor/lts-example-monitor-springboot/src/main/java/com/github/ltsopensource/example/springboot/Application.java new file mode 100644 index 000000000..52dacf708 --- /dev/null +++ b/lts-examples/lts-example-monitor/lts-example-monitor-springboot/src/main/java/com/github/ltsopensource/example/springboot/Application.java @@ -0,0 +1,20 @@ +package com.github.ltsopensource.example.springboot; + +import com.github.ltsopensource.spring.boot.annotation.EnableMonitor; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +/** + * @author Robert HG (254963746@qq.com) on 4/9/16. + */ +@SpringBootApplication +@EnableMonitor +@ComponentScan("com.github.ltsopensource.example") +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/lts-examples/lts-example-monitor/lts-example-monitor-springboot/src/main/resources/application.properties b/lts-examples/lts-example-monitor/lts-example-monitor-springboot/src/main/resources/application.properties new file mode 100644 index 000000000..8de3640be --- /dev/null +++ b/lts-examples/lts-example-monitor/lts-example-monitor-springboot/src/main/resources/application.properties @@ -0,0 +1,7 @@ +lts.monitor.cluster-name=test_cluster +lts.monitor.registry-address=zookeeper://127.0.0.1:2181 +lts.monitor.configs.job.logger=mysql +lts.monitor.configs.job.queue=mysql +lts.monitor.configs.jdbc.url=jdbc:mysql://127.0.0.1:3306/lts +lts.monitor.configs.jdbc.username=root +lts.monitor.configs.jdbc.password=root \ No newline at end of file diff --git a/lts-examples/lts-example-monitor/lts-example-monitor-springboot/src/main/resources/log4j.properties b/lts-examples/lts-example-monitor/lts-example-monitor-springboot/src/main/resources/log4j.properties new file mode 100644 index 000000000..a98c1d1d2 --- /dev/null +++ b/lts-examples/lts-example-monitor/lts-example-monitor-springboot/src/main/resources/log4j.properties @@ -0,0 +1,7 @@ + +log4j.rootLogger=INFO,stdout + +log4j.appender.stdout.Threshold=INFO +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d [%t] (%F:%L) %-5p %c %x - %m%n \ No newline at end of file diff --git a/lts-examples/lts-example-monitor/pom.xml b/lts-examples/lts-example-monitor/pom.xml new file mode 100644 index 000000000..1d44dab67 --- /dev/null +++ b/lts-examples/lts-example-monitor/pom.xml @@ -0,0 +1,48 @@ + + + + lts-examples + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + pom + + lts-example-monitor-springboot + + lts-example-monitor + + + + com.github.ltsopensource + lts + + + log4j + log4j + + + com.github.sgroschupf + zkclient + + + mysql + mysql-connector-java + + + com.alibaba + druid + + + com.alibaba + fastjson + + + org.javassist + javassist + + + + diff --git a/lts-examples/lts-example-quartz/pom.xml b/lts-examples/lts-example-quartz/pom.xml new file mode 100644 index 000000000..bc90cefc0 --- /dev/null +++ b/lts-examples/lts-example-quartz/pom.xml @@ -0,0 +1,92 @@ + + + + lts-examples + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + + lts-example-quartz + + + + com.github.ltsopensource + lts + + + com.github.sgroschupf + zkclient + + + io.netty + netty-all + + + com.alibaba + fastjson + + + org.mapdb + mapdb + + + org.javassist + javassist + + + org.springframework + spring-core + + + org.springframework + spring-beans + + + org.springframework + spring-context + + + org.springframework + spring-context-support + + + org.springframework + spring-tx + + + + org.quartz-scheduler + quartz + 2.2.2 + + + c3p0 + c3p0 + + + org.slf4j + slf4j-api + + + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + slf4j-log4j12 + ${slf4j.version} + + + org.fusesource.leveldbjni + leveldbjni-all + ${leveldbjni.version} + + + + diff --git a/lts-examples/lts-example-quartz/src/main/java/com/github/ltsopensource/example/Main.java b/lts-examples/lts-example-quartz/src/main/java/com/github/ltsopensource/example/Main.java new file mode 100644 index 000000000..63dbefb3d --- /dev/null +++ b/lts-examples/lts-example-quartz/src/main/java/com/github/ltsopensource/example/Main.java @@ -0,0 +1,16 @@ +package com.github.ltsopensource.example; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +/** + * @author Robert HG (254963746@qq.com) on 3/16/16. + */ +public class Main { + + public static void main(String[] args) { + + ApplicationContext context = new ClassPathXmlApplicationContext("/lts-quartz.xml"); + } + +} diff --git a/lts-examples/lts-example-quartz/src/main/java/com/github/ltsopensource/example/QuartzTest.java b/lts-examples/lts-example-quartz/src/main/java/com/github/ltsopensource/example/QuartzTest.java new file mode 100644 index 000000000..9ee3224cc --- /dev/null +++ b/lts-examples/lts-example-quartz/src/main/java/com/github/ltsopensource/example/QuartzTest.java @@ -0,0 +1,16 @@ +package com.github.ltsopensource.example; + +import com.github.ltsopensource.core.commons.utils.DateUtils; + +import java.util.Date; + +/** + * @author Robert HG (254963746@qq.com) on 3/16/16. + */ +public class QuartzTest { + + public void autoRun() throws InterruptedException { + System.out.println(DateUtils.formatYMD_HMS(new Date()) + " 我执行了..."); + } + +} diff --git a/lts-examples/lts-example-quartz/src/main/java/com/github/ltsopensource/example/QuartzTestJob.java b/lts-examples/lts-example-quartz/src/main/java/com/github/ltsopensource/example/QuartzTestJob.java new file mode 100644 index 000000000..288f419fc --- /dev/null +++ b/lts-examples/lts-example-quartz/src/main/java/com/github/ltsopensource/example/QuartzTestJob.java @@ -0,0 +1,24 @@ +package com.github.ltsopensource.example; + +import com.github.ltsopensource.core.commons.utils.DateUtils; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.springframework.scheduling.quartz.QuartzJobBean; + +import java.util.Date; +import java.util.Map; + +/** + * @author Robert HG (254963746@qq.com) on 3/16/16. + */ +public class QuartzTestJob extends QuartzJobBean { + + @Override + protected void executeInternal(JobExecutionContext context) throws JobExecutionException { + + for (Map.Entry entry : context.getMergedJobDataMap().entrySet()) { + System.out.println(entry.getKey() + ":" + entry.getValue()); + } + System.out.println(DateUtils.formatYMD_HMS(new Date()) + " 我开始执行了..."); + } +} diff --git a/lts-examples/lts-example-quartz/src/main/resources/log4j.properties b/lts-examples/lts-example-quartz/src/main/resources/log4j.properties new file mode 100644 index 000000000..a98c1d1d2 --- /dev/null +++ b/lts-examples/lts-example-quartz/src/main/resources/log4j.properties @@ -0,0 +1,7 @@ + +log4j.rootLogger=INFO,stdout + +log4j.appender.stdout.Threshold=INFO +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d [%t] (%F:%L) %-5p %c %x - %m%n \ No newline at end of file diff --git a/lts-examples/lts-example-quartz/src/main/resources/lts-quartz.xml b/lts-examples/lts-example-quartz/src/main/resources/lts-quartz.xml new file mode 100644 index 000000000..5afa07a49 --- /dev/null +++ b/lts-examples/lts-example-quartz/src/main/resources/lts-quartz.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lts-examples/lts-example-quartz/src/main/resources/lts.properties b/lts-examples/lts-example-quartz/src/main/resources/lts.properties new file mode 100644 index 000000000..86abf7ff8 --- /dev/null +++ b/lts-examples/lts-example-quartz/src/main/resources/lts.properties @@ -0,0 +1,14 @@ + +lts.jobclient.cluster-name=test_cluster +lts.jobclient.registry-address=zookeeper://127.0.0.1:2181 +lts.jobclient.node-group=test_jobClient +lts.jobclient.use-retry-client=true +lts.jobclient.configs.job.fail.store=mapdb + +lts.tasktracker.cluster-name=test_cluster +lts.tasktracker.registry-address=zookeeper://127.0.0.1:2181 +#lts.tasktracker.work-threads=64 +lts.tasktracker.node-group=test_trade_TaskTracker +#lts.tasktracker.dispatch-runner.enable=true +#lts.tasktracker.dispatch-runner.shard-value=taskId +lts.tasktracker.configs.job.fail.store=mapdb \ No newline at end of file diff --git a/lts-examples/lts-example-springboot/pom.xml b/lts-examples/lts-example-springboot/pom.xml new file mode 100644 index 000000000..6f09cf631 --- /dev/null +++ b/lts-examples/lts-example-springboot/pom.xml @@ -0,0 +1,126 @@ + + + 4.0.0 + + lts-parent + com.github.ltsopensource + 1.7.1-SNAPSHOT + + lts-example-springboot + jar + ${project.artifactId} + Example executor project for spring boot. + https://github.com/ltsopensource/light-task-scheduler + + 1.8 + UTF-8 + UTF-8 + 9.2.22.v20170606 + + + + + + org.springframework.boot + spring-boot-starter-parent + ${spring.boot.version} + pom + import + + + + + org.eclipse.jetty + jetty-server + ${jetty.version} + + + org.eclipse.jetty + jetty-util + ${jetty.version} + + + org.eclipse.jetty + jetty-http + ${jetty.version} + + + org.eclipse.jetty + jetty-io + ${jetty.version} + + + + + + + com.github.ltsopensource + lts + ${project.version} + + + org.slf4j + slf4j-log4j12 + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.apache.httpcomponents + httpasyncclient + + + com.alibaba + fastjson + + + com.alibaba + druid + + + io.dropwizard.metrics + metrics-jvm + 3.1.5 + + + + + mysql + mysql-connector-java + + + + org.mongodb + mongo-java-driver + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + \ No newline at end of file diff --git a/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/Application.java b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/Application.java new file mode 100644 index 000000000..3c5411982 --- /dev/null +++ b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/Application.java @@ -0,0 +1,24 @@ +package com.github.ltsopensource.example; + +import java.util.concurrent.TimeUnit; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; + +import com.codahale.metrics.ConsoleReporter; + +/** + * @author Robert HG (254963746@qq.com) on 4/9/16. + */ +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + ApplicationContext ctx = SpringApplication.run(Application.class, args); + // 启动Reporter + ConsoleReporter reporter = ctx.getBean(ConsoleReporter.class); + reporter.start(2, TimeUnit.SECONDS); + } + +} \ No newline at end of file diff --git a/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/config/DruidConfig.java b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/config/DruidConfig.java new file mode 100644 index 000000000..d72ffb981 --- /dev/null +++ b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/config/DruidConfig.java @@ -0,0 +1,77 @@ +package com.github.ltsopensource.example.config; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.util.StringUtils; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.alibaba.druid.pool.xa.DruidXADataSource; + + +@Configuration +@ComponentScan(basePackages = "com.github.ltsopensource.example.service") +public class DruidConfig { + private Logger logger = LoggerFactory.getLogger(DruidConfig.class); + @Value("${lts.db.driverName}") + private String driverName; + @Value("${lts.db.url}") + private String url; + @Value("${lts.db.username}") + private String username; + @Value("${lts.db.password}") + private String password; + @Value("${lts.db.max_pool_size}") + private int max_pool_size=10; + @Value("${lts.db.init_pool_size}") + private int init_pool_size=2; + + @Bean(name="connection",destroyMethod = "close") + public DruidPooledConnection init() throws Exception { + logger.info("-----database config init.-------"); + @SuppressWarnings("resource") + DruidXADataSource dataSource = new DruidXADataSource(); + if(!StringUtils.isEmpty(driverName)){ + dataSource.setDriverClassName(driverName); + } + dataSource.setUrl(url); + dataSource.setUsername(username); + dataSource.setPassword(password); +// 配置初始化大小、最小、最大 + if(max_pool_size>0){ + dataSource.setMaxActive(max_pool_size);//最大连接池数量 + dataSource.setMinIdle(Double.valueOf(max_pool_size/5).intValue()); + } + if(init_pool_size>0){ + dataSource.setInitialSize(init_pool_size);//初始化时建立物理连接的个数 + } +// 配置获取连接等待超时的时间 + dataSource.setMaxWait(600000l); +// 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + dataSource.setTimeBetweenEvictionRunsMillis(600000l); +// 配置一个连接在池中最小生存的时间,单位是毫秒 + dataSource.setMinEvictableIdleTimeMillis(600000l); + dataSource.setValidationQuery("SELECT 'x'"); + dataSource.setTestWhileIdle(true); + dataSource.setTestOnBorrow(false); + dataSource.setTestOnReturn(false); +// 打开PSCache,并且指定每个连接上PSCache的大小 + dataSource.setPoolPreparedStatements(false); + dataSource.setMaxPoolPreparedStatementPerConnectionSize(20); +// 配置监控统计拦截的filters + dataSource.setFilters("stat,log4j"); +// 打开removeAbandoned功能,如果连接超过30分钟未关闭,就会被强行回收,并且日志记录连接申请时输出错误日志 + dataSource.setRemoveAbandoned(true);//打开removeAbandoned功能 + dataSource.setRemoveAbandonedTimeout(1800);//1800秒,也就是30分钟 + dataSource.setLogAbandoned(true);//关闭abanded连接时输出错误日志 +// 合并多个DruidDataSource的监控数据 + dataSource.setUseGlobalDataSourceStat(true); +// dataSource.setConnectionProperties("autoReconnect=true"); + dataSource.init(); + return dataSource.getConnection(); + } + +} \ No newline at end of file diff --git a/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/config/LtsJobConfig.java b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/config/LtsJobConfig.java new file mode 100644 index 000000000..c52a4b1be --- /dev/null +++ b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/config/LtsJobConfig.java @@ -0,0 +1,147 @@ +package com.github.ltsopensource.example.config; + +import java.util.Properties; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +import com.github.ltsopensource.example.handle.JobClientCompletedHandler; +import com.github.ltsopensource.example.handle.JobHandle; +import com.github.ltsopensource.example.handle.TaskTrackerJobRunner; +import com.github.ltsopensource.jobclient.JobClient; +import com.github.ltsopensource.jobtracker.JobTracker; +import com.github.ltsopensource.spring.JobClientFactoryBean; +import com.github.ltsopensource.spring.JobTrackerFactoryBean; +import com.github.ltsopensource.spring.TaskTrackerAnnotationFactoryBean; +import com.github.ltsopensource.tasktracker.TaskTracker; + +@Configuration +@ComponentScan(basePackages = "com.github.ltsopensource.example.handle") +public class LtsJobConfig implements ApplicationContextAware{ + private Logger logger = LoggerFactory.getLogger(DruidConfig.class); + /*************************************************************************************/ + /***************************************JobCommon*************************************/ + /*************************************************************************************/ + @Value("${lts.cluster.name}") + private String clusterName; + @Value("${lts.job.fail.store}") + private String failStore; + @Value("${lts.registry-address}") + private String registryAddress; + /*************************************************************************************/ + /***************************************JobClient*************************************/ + /*************************************************************************************/ + @Value("${lts.jobclient.node-group}") + private String nodeGroup; + @Value("${lts.jobclient.use-retry-client}") + private boolean useRetryClient; + /*************************************************************************************/ + /***************************************JobTracker************************************/ + /*************************************************************************************/ + @Value("${lts.jobtracker.listen-port}") + private int listenPort=35001; + @Value("${lts.jobtracker.configs.job.logger}") + private String jobLogger; + @Value("${lts.jobtracker.configs.job.queue}") + private String jobQueue; + @Value("${lts.jobtracker.configs.jdbc.url}") + private String url; + @Value("${lts.jobtracker.configs.jdbc.username}") + private String username; + @Value("${lts.jobtracker.configs.jdbc.password}") + private String password; + @Value("${lts.jobtracker.configs.mongo.addresses}") + private String addresses; + @Value("${lts.jobtracker.configs.mongo.database}") + private String database; + @Value("${lts.jobtracker.configs.mongo.username}") + private String musername; + @Value("${lts.jobtracker.configs.mongo.password}") + private String mpassword; + /*************************************************************************************/ + /***************************************TaskTracker***********************************/ + /*************************************************************************************/ + @Value("${lts.tasktracker.node-group}") + private String tnodeGroup; + @Value("${lts.tasktracker.work-threads}") + private int workThreads=64; + /*************************************************************************************/ + /****************************************JobHandle************************************/ + /*************************************************************************************/ + @Autowired + private JobClientCompletedHandler jobCompletedHandler; +// @Autowired +// private TaskTrackerJobRunner jobRunnerClass; + + private ApplicationContext applicationContext; + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext; + } + @SuppressWarnings("rawtypes") + @Bean(name="jobClient",initMethod="start",destroyMethod = "destroy") + public JobClient jobClient() throws Exception { + logger.info("-----JobClient config init.-------"); + JobClientFactoryBean factory = new JobClientFactoryBean(); + factory.setClusterName(clusterName); + factory.setRegistryAddress(registryAddress); + factory.setNodeGroup(nodeGroup); + factory.setUseRetryClient(useRetryClient); + Properties configs = new Properties(); + configs.put("job.fail.store", failStore); + factory.setConfigs(configs); + factory.setJobCompletedHandler(jobCompletedHandler); + factory.afterPropertiesSet(); + return factory.getObject(); + } + @Bean(name="JobTracker",initMethod="start",destroyMethod = "destroy") + public JobTracker jobTracker() throws Exception { + logger.info("-----JobTracker config init.-------"); + JobTrackerFactoryBean factory = new JobTrackerFactoryBean(); + factory.setClusterName(clusterName); + factory.setRegistryAddress(registryAddress); + factory.setListenPort(listenPort); + Properties configs = new Properties(); + configs.put("job.logger", jobLogger); + configs.put("job.queue", jobQueue); + if(jobLogger.equalsIgnoreCase("mysql")||jobQueue.equalsIgnoreCase("mysql")){ + configs.put("jdbc.url", url); + configs.put("jdbc.username", username); + configs.put("jdbc.password", password); + } + if(jobLogger.equalsIgnoreCase("mongo")||jobQueue.equalsIgnoreCase("mongo")){ + configs.put("mongo.addresses", addresses); + configs.put("mongo.database", database); + configs.put("mongo.username", musername); + configs.put("mongo.password", mpassword); + } + factory.setConfigs(configs); + factory.afterPropertiesSet(); + return factory.getObject(); + } + @Bean(name="taskTracker",initMethod="start",destroyMethod = "destroy") + public TaskTracker taskTracker() throws Exception { + logger.info("-----TaskTracker config init.-------"); + TaskTrackerAnnotationFactoryBean factory = new TaskTrackerAnnotationFactoryBean(); + factory.setClusterName(clusterName); + factory.setRegistryAddress(registryAddress); + factory.setNodeGroup(tnodeGroup); + factory.setWorkThreads(workThreads); + JobHandle.TASK_TRACKER_NODE_GROUP = tnodeGroup; + Properties configs = new Properties(); + configs.put("job.fail.store", failStore); + factory.setConfigs(configs); + factory.setApplicationContext(applicationContext); + factory.setJobRunnerClass(TaskTrackerJobRunner.class); + factory.afterPropertiesSet(); + return factory.getObject(); + } +} \ No newline at end of file diff --git a/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/config/MetricConfig.java b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/config/MetricConfig.java new file mode 100644 index 000000000..09c14e664 --- /dev/null +++ b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/config/MetricConfig.java @@ -0,0 +1,80 @@ +package com.github.ltsopensource.example.config; +import com.codahale.metrics.*; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.concurrent.TimeUnit; + +@Configuration +public class MetricConfig { + + @Bean + public MetricRegistry metrics() { + return new MetricRegistry(); + } + + /** + * Reporter 数据的展现位置 + * + * @param metrics + * @return + */ + @Bean + public ConsoleReporter consoleReporter(MetricRegistry metrics) { + return ConsoleReporter.forRegistry(metrics).convertRatesTo(TimeUnit.SECONDS).convertDurationsTo(TimeUnit.MILLISECONDS).build(); + } + + @Bean + public Slf4jReporter slf4jReporter(MetricRegistry metrics) { + return Slf4jReporter.forRegistry(metrics).outputTo(LoggerFactory.getLogger(MetricConfig.class)).convertRatesTo(TimeUnit.SECONDS).convertDurationsTo(TimeUnit.MILLISECONDS).build(); + } + + @Bean + public JmxReporter jmxReporter(MetricRegistry metrics) { + return JmxReporter.forRegistry(metrics).build(); + } + +// /** +// * TPS 计算器 +// * +// * @param metrics +// * @return +// */ +// @Bean("tps") +// public Meter meter(MetricRegistry metrics) { +// return metrics.meter("Metric-TPS"); +// } +// /** +// * 直方图 +// * +// * @param metrics +// * @return +// */ +// @Bean +// public Histogram histogram(MetricRegistry metrics) { +// return metrics.histogram("Metric-Histogram"); +// } +// +// /** +// * 计数器 +// * +// * @param metrics +// * @return +// */ +// @Bean +// public Counter jobcounter(MetricRegistry metrics) { +// return metrics.counter("Metric-Counter"); +// } +// +// /** +// * 计时器 +// * +// * @param metrics +// * @return +// */ +// @Bean +// public Timer jobtimer(MetricRegistry metrics) { +// return metrics.timer("Metric-Execute-Time"); +// } +} \ No newline at end of file diff --git a/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/config/MongoDBConfig.java b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/config/MongoDBConfig.java new file mode 100644 index 000000000..6a638852b --- /dev/null +++ b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/config/MongoDBConfig.java @@ -0,0 +1,71 @@ +package com.github.ltsopensource.example.config; + +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.util.StringUtils; + +import com.mongodb.MongoClient; +import com.mongodb.MongoClientOptions; +import com.mongodb.MongoClientOptions.Builder; +import com.mongodb.MongoCredential; +import com.mongodb.ServerAddress; +import com.mongodb.client.MongoDatabase; + + +@Configuration +@ComponentScan(basePackages = "com.github.ltsopensource.example.service") +public class MongoDBConfig { + private Logger logger = LoggerFactory.getLogger(MongoDBConfig.class); + @Value("${lts.mongodb.servers}") + private String servers; + @Value("${lts.mongodb.database}") + private String database; + @Value("${lts.mongodb.schema}") + private String schema; + @Value("${lts.mongodb.username}") + private String username; + @Value("${lts.mongodb.password}") + private String password; + @Value("${lts.mongodb.max_wait_time}") + private int maxWaitTime=24*60; + + @Bean(name="session") + public MongoDatabase init() throws Exception { + logger.info("-----mongodb config init.-------"); + List seeds = new ArrayList(); + if (servers != null && !"".equals(servers)) { + for (String server : servers.split(",")) { + String[] address = server.split(":"); + String ip = address[0]; + int port = 27017; + if (address != null && address.length > 1) { + port = Integer.valueOf(address[1]); + } + seeds.add(new ServerAddress(ip, port)); + } + } + Builder builder = new MongoClientOptions.Builder(); + if(maxWaitTime>0){ + builder.maxWaitTime(maxWaitTime*60*1000); + } + // 通过连接认证获取MongoDB连接 + @SuppressWarnings("resource") + MongoClient client = new MongoClient(seeds, builder.build()); + if(!StringUtils.isEmpty(username)){ + MongoCredential credential = MongoCredential.createScramSha1Credential(username, database,password.toCharArray()); + List credentials = new ArrayList(); + credentials.add(credential); + client = new MongoClient(seeds, credentials, builder.build()); + } + MongoDatabase connect = client.getDatabase(schema);// 连接到数据库 + return connect; + } + +} \ No newline at end of file diff --git a/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/config/SpringMetricConfig.java b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/config/SpringMetricConfig.java new file mode 100644 index 000000000..f8d3d58eb --- /dev/null +++ b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/config/SpringMetricConfig.java @@ -0,0 +1,21 @@ +package com.github.ltsopensource.example.config; +// +//import java.util.concurrent.TimeUnit; +// +//import org.springframework.context.annotation.Configuration; +//import com.codahale.metrics.ConsoleReporter; +//import com.codahale.metrics.MetricRegistry; +//import com.ryantenney.metrics.spring.config.annotation.EnableMetrics; +//import com.ryantenney.metrics.spring.config.annotation.MetricsConfigurerAdapter; +// +//@Configuration +//@EnableMetrics +//public class SpringMetricConfig extends MetricsConfigurerAdapter { +// /** +// * registerReporter allows the MetricsConfigurerAdapter to shut down the reporter when the Spring context is closed +// */ +// @Override +// public void configureReporters(MetricRegistry metricRegistry) { +// registerReporter(ConsoleReporter.forRegistry(metricRegistry).build()).start(1, TimeUnit.MINUTES); +// } +//} diff --git a/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/controller/JobController.java b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/controller/JobController.java new file mode 100644 index 000000000..1e1c1ce55 --- /dev/null +++ b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/controller/JobController.java @@ -0,0 +1,154 @@ +package com.github.ltsopensource.example.controller; + +import java.util.Date; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import org.apache.http.client.utils.DateUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.codahale.metrics.Counter; +import com.codahale.metrics.Histogram; +import com.codahale.metrics.Meter; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.Timer; +import com.github.ltsopensource.example.handle.JobHandle; +import com.github.ltsopensource.example.service.JobService; + +@Controller +@EnableAutoConfiguration +public class JobController { + private Logger logger = LoggerFactory.getLogger(JobController.class); + @Autowired + private JobHandle handle; + @Autowired + private JobService jobService; + @Autowired + private MetricRegistry regist; + @RequestMapping("/") + @ResponseBody + public String index(@RequestParam(defaultValue="0") int type) { + JobService.DATABASE_TYPE = type; + return "[DBType:"+(type==1?"MongoDB":"MySQL|MariaDB")+"]"; + } + @RequestMapping("/job") + @ResponseBody + public String job(@RequestParam(defaultValue="0") int type,@RequestParam(defaultValue="1") int thread,@RequestParam(defaultValue="1") int count,@RequestParam(defaultValue="false") boolean flag,@RequestParam(defaultValue="1") int jobType,@RequestParam(defaultValue="") String childKey) { + String table = "insert_job"; + boolean rebuilt = false; + if(type==1){ + table = "select_job"; + }else if(type==2){ + table = "update_job"; + }else if(type==3){ + table = "delete_job"; + }else{ + rebuilt = true; + } + jobService.createTable(table, rebuilt); + final int _type = type; + final int _thread = thread; + final String _table = table; + final int _count = count; + final boolean _flag = flag; + final int _jobType = jobType; + Thread main = new Thread(new Runnable() { + @Override + public void run() { + if(_flag){ + jobthread(_type, _thread, _table, _count, _jobType); + }else{ + jobdetail(_type, _thread, _table, _count, _jobType); + } + } + }); + main.start(); + return "["+table+"]Success!"; + } + private void jobdetail(final int type,final int thread,final String table,final int count,final int jobType){ + final Meter meter = regist.meter("Controller-Metric-TPS"); + final Histogram histogram = regist.histogram("Controller-Metric-Histogram"); + final Counter jobcounter = regist.counter("Controller-Metric-Counter"); + final Timer jobtimer = regist.timer("Controller-Metric-ExecuteTime"); + ExecutorService service = Executors.newSingleThreadExecutor(); + if(thread>1){ + service = Executors.newFixedThreadPool(thread); + }else{ + if(thread<0){ + service = Executors.newCachedThreadPool(); + } + } + for(int i=0;thread>0?i0?i0?i0?i jobResults) { + // 任务执行反馈结果处理 + if (CollectionUtils.isNotEmpty(jobResults)) { + for (JobResult jobResult : jobResults) { + System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 任务执行完成:" + jobResult); + } + } + } +} diff --git a/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/handle/JobHandle.java b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/handle/JobHandle.java new file mode 100644 index 000000000..6a745a852 --- /dev/null +++ b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/handle/JobHandle.java @@ -0,0 +1,106 @@ +package com.github.ltsopensource.example.handle; + +import java.util.Date; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.github.ltsopensource.core.domain.Job; +import com.github.ltsopensource.jobclient.JobClient; +import com.github.ltsopensource.jobclient.domain.Response; +@Component +public class JobHandle { + public static String TASK_TRACKER_NODE_GROUP = "css-task-tracker"; + public static String ADMIN_TASK_TRACKER_NODE_GROUP = "admin-task-tracker"; + @SuppressWarnings("rawtypes") + @Autowired + private JobClient jobClient; + /** + * @decription 实时任务 + * @author yi.zhang + * @time 2017年11月3日 上午11:23:15 + * @param url 请求URL + * @param params 请求参数 + * @return + */ + public Response handleRealtimeJob(int type,String table,String taskId){ + Job job = new Job(); + job.setTaskId("realtime_"+taskId); + job.setParam("type", type+""); + job.setParam("table", table); + job.setTaskTrackerNodeGroup(taskId.startsWith("t")?ADMIN_TASK_TRACKER_NODE_GROUP:TASK_TRACKER_NODE_GROUP); + job.setNeedFeedback(true); + job.setReplaceOnExist(true); // 当任务队列中存在这个任务的时候,是否替换更新 + Response response = jobClient.submitJob(job); + return response; + } + /** + * @decription 重复任务 + * @author yi.zhang + * @time 2017年11月3日 上午11:24:11 + * @param url 请求URL + * @param params 请求参数 + * @param repeatCount 重复次数 + * @param intervalTime 重复间隔(单位:秒) + * @return + */ + public Response handleRepeatJob(int type,String table,String taskId,int repeatCount,long intervalTime){ + Job job = new Job(); + job.setTaskId("repeat_"+taskId); + job.setParam("type", type+""); + job.setParam("table", table); + job.setTaskTrackerNodeGroup(taskId.startsWith("t")?ADMIN_TASK_TRACKER_NODE_GROUP:TASK_TRACKER_NODE_GROUP); + job.setNeedFeedback(true); + job.setReplaceOnExist(true); // 当任务队列中存在这个任务的时候,是否替换更新 + job.setRepeatCount(repeatCount); // 一共执行50次 + job.setRepeatInterval(intervalTime * 1000L); // 50s 执行一次 + Response response = jobClient.submitJob(job); + return response; + } + /** + * @decription 周期任务 + * @author yi.zhang + * @time 2017年11月3日 上午11:25:25 + * @param url 请求URL + * @param params 请求参数 + * @param cron 周期表达式(例如:0 0/1 * * * ?) + * @return + */ + public Response handleCronJob(int type,String table,String taskId,String cron){ + Job job = new Job(); + job.setTaskId("cron"+taskId); + job.setParam("type", type+""); + job.setParam("table", table); + job.setTaskTrackerNodeGroup(taskId.startsWith("t")?ADMIN_TASK_TRACKER_NODE_GROUP:TASK_TRACKER_NODE_GROUP); // 执行要执行该任务的taskTracker的节点组名称 + job.setNeedFeedback(true); + job.setReplaceOnExist(true); // 当任务队列中存在这个任务的时候,是否替换更新 + job.setCronExpression("0 0/1 * * * ?"); + Response response = jobClient.submitJob(job); + return response; + } + /** + * @decription 定时任务 + * @author yi.zhang + * @time 2017年11月3日 上午11:26:43 + * @param url 请求URL + * @param params 请求参数 + * @param start 开始时间 + * @param time 定时时间(单位:秒) + * @return + */ + public Response handleTriggerTimeJob(int type,String table,String taskId,Date start,long time){ + Job job = new Job(); + job.setTaskId("trigger_"+taskId); + job.setParam("type", type+""); + job.setParam("table", table); + job.setTaskTrackerNodeGroup(taskId.startsWith("t")?ADMIN_TASK_TRACKER_NODE_GROUP:TASK_TRACKER_NODE_GROUP); + job.setNeedFeedback(true); + job.setReplaceOnExist(true); // 当任务队列中存在这个任务的时候,是否替换更新 + if(start==null){ + start = new Date(); + } + job.setTriggerTime(start.getTime()+time * 1000L); // 1 小时之后执行 + Response response = jobClient.submitJob(job); + return response; + } +} diff --git a/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/handle/TaskTrackerJobRunner.java b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/handle/TaskTrackerJobRunner.java new file mode 100644 index 000000000..51585a7b8 --- /dev/null +++ b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/handle/TaskTrackerJobRunner.java @@ -0,0 +1,125 @@ +package com.github.ltsopensource.example.handle; + +import java.util.Date; +import java.util.List; +import java.util.Random; + +import org.apache.http.client.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.codahale.metrics.Counter; +import com.codahale.metrics.Histogram; +import com.codahale.metrics.Meter; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.Timer; +import com.github.ltsopensource.core.domain.Action; +import com.github.ltsopensource.core.domain.Job; +import com.github.ltsopensource.core.logger.Logger; +import com.github.ltsopensource.core.logger.LoggerFactory; +import com.github.ltsopensource.example.service.JobService; +import com.github.ltsopensource.example.service.pojo.RealTimeJob; +import com.github.ltsopensource.tasktracker.Result; +import com.github.ltsopensource.tasktracker.runner.JobContext; +import com.github.ltsopensource.tasktracker.runner.JobRunner; + +@Component +public class TaskTrackerJobRunner implements JobRunner { + private static final Logger logger = LoggerFactory.getLogger(TaskTrackerJobRunner.class); + @Autowired + private JobService jobService; + @Autowired + private MetricRegistry regist; + + @Override + public Result run(JobContext jctx) throws Throwable { + String result = ""; + Date today = new Date(); + String datetime = DateUtils.formatDate(today, "yyyy-MM-dd HH:mm:ss"); + try { +// BizLogger log = LtsLoggerFactory.getBizLogger(); +// BizLogger log = jctx.getBizLogger(); + Job job = jctx.getJob(); + // TODO 业务逻辑 + logger.info("--lts-context:" + jctx); + // 会发送到 LTS (JobTracker上) +// log.info("LTS-JOB, Insert Job."); + System.out.println("\n\n\n---------------------------------------------------------------------------------"); + System.out.println("---------------------------------------------------------------------------------"); + System.out.println("-job-task-tracker--"+job.getTaskId()+"-->"+job.getTaskTrackerNodeGroup()+"-->"+job.getSubmitNodeGroup()); + System.out.println("---------------------------------------------------------------------------------"); + System.out.println("---------------------------------------------------------------------------------\n\n\n"); + String table = job.getParam("table"); + int type = Integer.valueOf(job.getParam("type")); + if(type==1){ + result = selectJob(table); + }else{ + result = insertJob(table, today); + } + } catch (Exception e) { + logger.info("Run job failed!", e); + return new Result(Action.EXECUTE_FAILED, e.getMessage()); + } + return new Result(Action.EXECUTE_SUCCESS, "["+datetime+"]"+result); + } + + private String insertJob(String table,Date today){ + String result = ""; + final Meter meter = regist.meter("LTS-Insert-Handle-Metric-TPS"); + final Histogram histogram = regist.histogram("LTS-Insert-Handle-Metric-Histogram"); + final Counter jobcounter = regist.counter("LTS-Insert-Handle-Metric-Counter"); + final Timer jobtimer = regist.timer("LTS-Insert-Handle-Metric-ExecuteTime"); + int random = new Random().nextInt(10000); + RealTimeJob obj = new RealTimeJob(); + obj.setCode("code"); + obj.setContent("百度翻译支持全球28种热门语言互译"); + obj.setCreatetime(today); + obj.setFlag(random%2==0?true:false); + obj.setMax_retry_times(random); + obj.setMsg(random%2==0?"Success":"Error"); + obj.setName(table); + obj.setPrice(3.1413926+random); + obj.setPriority(0); + obj.setRetry_times(1); + obj.setStatus(random%2); + obj.setTotal(today.getTime()); + obj.setUpdatetime(today); + meter.mark(); + jobcounter.inc(); + histogram.update(new Random().nextInt(10)); + final Timer.Context context = jobtimer.time(); + try { + jobService.insert(table, obj); + result = "insert success!"; + }catch (Exception e) { + logger.info("--lts insert error!", e); + result = "insert error!"; + }finally { + context.stop(); + } + return result; + } + private String selectJob(String table){ + String result = ""; + Meter meter = regist.meter("LTS-Select-Handle-Metric-TPS"); + Histogram histogram = regist.histogram("LTS-Select-Handle-Metric-Histogram"); + Counter jobcounter = regist.counter("LTS-Select-Handle-Metric-Counter"); + Timer jobtimer = regist.timer("LTS-Select-Handle-Metric-ExecuteTime"); + int count = 0; + meter.mark(); + jobcounter.inc(); + histogram.update(new Random().nextInt(10)); + final Timer.Context context = jobtimer.time(); + try { + List list = jobService.select(table); + count = list!=null?list.size():0; + result = "select data size:"+count; + }catch (Exception e) { + logger.info("--lts select error!", e); + result = "select error!"; + }finally { + context.stop(); + } + return result; + } +} diff --git a/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/service/JdbcHandle.java b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/service/JdbcHandle.java new file mode 100644 index 000000000..f3ac612ef --- /dev/null +++ b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/service/JdbcHandle.java @@ -0,0 +1,184 @@ +package com.github.ltsopensource.example.service; + +import java.lang.reflect.Field; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.alibaba.druid.pool.DruidPooledConnection; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +@Component +public class JdbcHandle { + private static Logger logger = LoggerFactory.getLogger(JdbcHandle.class); + @Autowired + DruidPooledConnection connection; + + public void dropTable(String table){ + try { + String sql = "drop table if exists "+table; + connection.prepareStatement(sql).execute(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + public void createTable(String sql){ + try { + String _sql = sql.toLowerCase().trim(); + if(_sql.startsWith("create")&&_sql.contains("table")){ + connection.prepareStatement(sql).execute(); + } + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + /** + * 描述: 数据操作(Insert|Update|Delete) + * 时间: 2017年11月15日 上午11:27:52 + * @author yi.zhang + * @param sql sql语句 + * @param params 参数 + * @return 返回值 + */ + public int executeUpdate(String sql,Object...params ){ + try { + PreparedStatement ps = connection.prepareStatement(sql); + if(params!=null&¶ms.length>0){ + for(int i=1;i<=params.length;i++){ + Object value = params[i-1]; + ps.setObject(i, value); + } + } + int result = ps.executeUpdate(); + return result; + } catch (Exception e) { + logger.error("-----SQL excute update Error-----", e); + } + return -1; + } + /** + * 描述: 数据库查询(Select) + * 时间: 2017年11月15日 上午11:28:42 + * @author yi.zhang + * @param sql sql语句 + * @param clazz 映射对象 + * @param params 占位符参数 + * @return + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + public List executeQuery(String sql,Class clazz,Object...params){ + try { + List list=new ArrayList(); + PreparedStatement ps = connection.prepareStatement(sql); + if(params!=null&¶ms.length>0){ + for(int i=1;i<=params.length;i++){ + Object value = params[i-1]; + ps.setObject(i, value); + } + } + ResultSet rs = ps.executeQuery(); + ResultSetMetaData rsmd = rs.getMetaData(); + int count = rsmd.getColumnCount(); + Map reflect = new HashMap(); + for(int i=1;i<=count;i++){ + String column = rsmd.getColumnName(i); + String tcolumn = column.replaceAll("_", ""); + if(clazz==null){ + reflect.put(column, column); + }else{ + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + String tfield = field.getName(); + if(tcolumn.equalsIgnoreCase(tfield)){ + reflect.put(column, tfield); + break; + } + } + } + } + while(rs.next()){ + JSONObject obj = new JSONObject(); + for(String column:reflect.keySet()){ + String key = reflect.get(column); + Object value = rs.getObject(column); + obj.put(key, value); + } + Object object = obj; + if(clazz!=null){ + object = JSON.parseObject(obj.toJSONString(), clazz); + } + list.add(object); + } + rs.close(); + ps.close(); + return list; + } catch (Exception e) { + logger.error("-----SQL excute query Error-----", e); + } + return null; + } + /** + * 描述: 查询数据表字段名(key:字段名,value:字段类型名) + * 时间: 2017年11月15日 上午11:29:32 + * @author yi.zhang + * @param table 表名 + * @return + */ + public Map queryColumns(String table){ + try { + String sql = "select * from "+table; + PreparedStatement ps = connection.prepareStatement(sql); + ResultSet rs = ps.executeQuery(); + ResultSetMetaData rsmd = rs.getMetaData(); + int count = rsmd.getColumnCount(); + Map reflect = new HashMap(); + for(int i=1;i<=count;i++){ + String column = rsmd.getColumnName(i); + String type = rsmd.getColumnTypeName(i); + reflect.put(column, type); + } + rs.close(); + ps.close(); + return reflect; + } catch (Exception e) { + logger.error("-----Columns excute query Error-----", e); + } + return null; + } + /** + * 描述: 查询数据库表名 + * 时间: 2017年11月15日 上午11:29:59 + * @author yi.zhang + * @return 返回表 + */ + public List queryTables(){ + try { + String sql = "show tables"; + PreparedStatement ps = connection.prepareStatement(sql); + ResultSet rs = ps.executeQuery(); + List tables = new ArrayList(); + while(rs.next()){ + String table = rs.getString(1); + tables.add(table); + } + rs.close(); + ps.close(); + return tables; + } catch (SQLException e) { + logger.error("-----Tables excute query Error-----", e); + } + return null; + } +} diff --git a/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/service/JobService.java b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/service/JobService.java new file mode 100644 index 000000000..ddcfde8ca --- /dev/null +++ b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/service/JobService.java @@ -0,0 +1,150 @@ +package com.github.ltsopensource.example.service; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.apache.http.client.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.alibaba.druid.util.StringUtils; +import com.github.ltsopensource.example.service.pojo.RealTimeJob; + +@Component +public class JobService { + /** + * 数据库类型(0.MySQL|MariaDB,1.MongoDB) + */ + public static int DATABASE_TYPE = 0; + @Autowired + JdbcHandle jdbcHandle; + @Autowired + MongoDBHandle mongodbHandle; + private static String TABLE_SQL_TEMPLATE = "table_sql_template.sql"; + private static Map DEFAULT_COLUMNS = null; + private String[] reflect(String table,RealTimeJob obj){ + Map columns = DEFAULT_COLUMNS==null||DEFAULT_COLUMNS.isEmpty()?jdbcHandle.queryColumns(table):DEFAULT_COLUMNS; + if(columns==null||columns.size()<1){ + createTable(table, true); + columns = jdbcHandle.queryColumns(table); + } + DEFAULT_COLUMNS = columns; + String keys = null; + String values = null; + if(obj!=null){ + Class clazz = obj.getClass(); + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + String name = field.getName(); + if(name.equalsIgnoreCase("serialVersionUID")||name.contains("$this")||!columns.containsKey(name)){ + continue; + } + String type = field.getType().getSimpleName(); + try { + Method method = clazz.getMethod((type.equalsIgnoreCase("boolean")?"is":"get")+name.substring(0, 1).toUpperCase()+ name.substring(1)); + Object value = method.invoke(obj); + if(type.equalsIgnoreCase("boolean")||type.equalsIgnoreCase("Date")){ + if(type.equalsIgnoreCase("Date")){ + value = DateUtils.formatDate(new Date(), "yyyy-MM-dd HH:mm:ss"); + } + value = value.toString(); + } + if(value!=null){ + if(StringUtils.isEmpty(keys)){ + keys = name; + values = (value instanceof String?"'"+value+"'":value+""); + }else{ + keys +=","+ name; + values +=","+ (value instanceof String?"'"+value+"'":value+""); + } + } + }catch (Exception e) { + e.printStackTrace(); + } + } + } + return new String[]{keys,values}; + } + private String readSqlFile(String fileName) throws Exception { + try { + InputStream is = this.getClass().getClassLoader().getResourceAsStream(fileName); + BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8")); + StringBuilder content = new StringBuilder(); + String data = null; + while ((data = br.readLine()) != null) { + content.append(data); + content.append(System.getProperty("line.separator")); + } + return content.toString(); + } catch (Exception e) { + throw new Exception("Read sql file : [" + fileName + "] error ", e); + } + } + /** + * 描述: 创建表 + * 时间: 2017年11月29日 上午10:18:42 + * @author yi.zhang + * @param table 表名 + * @param flag 存在表是否重新建表 + */ + public void createTable(String table,boolean flag){ + try { + if(DATABASE_TYPE==1){ + List tables = mongodbHandle.queryTables(); + if(tables!=null&&tables.contains(table)&&flag){ + mongodbHandle.dropTable(table); + tables.remove(table); + } + if(tables==null||!tables.contains(table)){ + mongodbHandle.createTable(table); + } + }else{ + List tables = jdbcHandle.queryTables(); + if(tables!=null&&tables.contains(table)&&flag){ + jdbcHandle.dropTable(table); + tables.remove(table); + } + if(tables==null||!tables.contains(table)){ + String sql = readSqlFile(TABLE_SQL_TEMPLATE); + sql = sql.replace("{job_table}", table); + jdbcHandle.createTable(sql); + } + } + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + public int insert(String table,RealTimeJob obj){ + int result = 0; + if(DATABASE_TYPE==1){ + mongodbHandle.save(table, obj); + }else{ + String[] data = reflect(table, obj); + String keys = data[0]; + String values = data[1]; + String sql = "insert into "+table+"("+keys+")values("+values+")"; + result = jdbcHandle.executeUpdate(sql); + } + return result; + } + + @SuppressWarnings("unchecked") + public List select(String table){ + if(DATABASE_TYPE==1){ + List list = (List) mongodbHandle.executeQuery(table, RealTimeJob.class,null); + return list; + }else{ + String sql = "select * from "+table; + List list = (List) jdbcHandle.executeQuery(sql, RealTimeJob.class); + return list; + } + } +} diff --git a/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/service/MongoDBHandle.java b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/service/MongoDBHandle.java new file mode 100644 index 000000000..1158937bb --- /dev/null +++ b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/service/MongoDBHandle.java @@ -0,0 +1,264 @@ +package com.github.ltsopensource.example.service; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.bson.Document; +import org.bson.conversions.Bson; +import org.bson.types.ObjectId; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.MongoIterable; +import com.mongodb.client.model.Filters; + +@Component +public class MongoDBHandle { + private static Logger logger = LoggerFactory.getLogger(MongoDBHandle.class); + /** + * 主键ID是否处理(true:处理[id],false:不处理[_id]) + */ + public static boolean ID_HANDLE=false; + /** + * 批量数据大小 + */ + public static int BATCH_SIZE = 10000; + /** + * 最大时间(单位:毫秒) + */ + public static int MAX_WAIT_TIME = 24*60*60*1000; + @Autowired + MongoDatabase session; + + public void dropTable(String table){ + try { + session.getCollection(table).drop(); + } catch (Exception e) { + logger.error("--mongodb drop error!",e); + } + } + public void createTable(String table){ + try { + session.createCollection(table); + } catch (Exception e) { + logger.error("--mongodb create error!",e); + } + } + /** + * @decription 保存数据 + * @author yi.zhang + * @time 2017年6月2日 下午6:18:49 + * @param table 文档名称(表名) + * @param obj + * @return + */ + public int save(String table, Object obj) { + try { + MongoCollection collection = session.getCollection(table); + if (collection == null) { + session.createCollection(table); + collection = session.getCollection(table); + } + collection.insertOne(Document.parse(JSON.toJSONString(obj))); + return 1; + } catch (Exception e) { + logger.error("--mongodb insert error!",e); + } + return -1; + } + + /** + * @decription 更新数据 + * @author yi.zhang + * @time 2017年6月2日 下午6:19:08 + * @param table 文档名称(表名) + * @param obj + * @return + */ + public int update(String table, Object obj) { + try { + MongoCollection collection = session.getCollection(table); + if (collection == null) { + return 0; + } + JSONObject json = JSON.parseObject(JSON.toJSONString(obj)); + Document value = Document.parse(JSON.toJSONString(obj)); + collection.replaceOne(Filters.eq("_id", json.containsKey("_id")?json.get("_id"):json.get("id")), value); + return 1; + } catch (Exception e) { + logger.error("--mongodb update error!",e); + } + return -1; + } + + /** + * @decription 删除数据 + * @author yi.zhang + * @time 2017年6月2日 下午6:19:25 + * @param table 文档名称(表名) + * @param obj + * @return + */ + public int delete(String table, Object obj) { + try { + MongoCollection collection = session.getCollection(table); + if (collection == null) { + return 0; + } + JSONObject json = JSON.parseObject(JSON.toJSONString(obj)); + collection.findOneAndDelete(Filters.eq("_id", json.containsKey("_id")?json.get("_id"):json.get("id"))); + return 1; + } catch (Exception e) { + logger.error("--mongodb delete error!",e); + } + return -1; + } + + /** + * @decription 数据库查询 + * @author yi.zhang + * @time 2017年6月26日 下午4:12:59 + * @param table 文档名称(表名) + * @param clazz 映射对象 + * @param params 参数 + * @return + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + public List executeQuery(String table, Class clazz, JSONObject params) { + try { + MongoCollection collection = session.getCollection(table); + if (collection == null) { + return null; + } + List list = new ArrayList(); + FindIterable documents = null; + if (params != null) { + List filters = new ArrayList(); + for (String key : params.keySet()) { + Object value = params.get(key); + filters.add(Filters.eq(key, value)); + } + documents = collection.find(Filters.and(filters)); + } else { + documents = collection.find(); + } + MongoCursor cursor = documents.batchSize(BATCH_SIZE).noCursorTimeout(true).iterator(); + while (cursor.hasNext()) { + JSONObject obj = new JSONObject(); + Document document = cursor.next(); + for (String column : document.keySet()) { + Object value = document.get(column); + if(value instanceof ObjectId){ + value = document.getObjectId(column).toHexString(); + } + if (clazz == null) { + obj.put(ID_HANDLE?column.replaceFirst("^(\\_?)", ""):column, value); + } else { + String tcolumn = column.replaceAll("_", ""); + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + String tfield = field.getName(); + if (column.equalsIgnoreCase(tfield) || tcolumn.equalsIgnoreCase(tfield)) { + obj.put(tfield, value); + break; + } + } + } + } + Object object = obj; + if (clazz != null) { + object = JSON.parseObject(obj.toJSONString(), clazz); + } + list.add(object); + } + cursor.close(); + return list; + } catch (Exception e) { + logger.error("--mongodb select error!",e); + } + return null; + } + + /** + * @decription 查询数据表字段名(key:字段名,value:字段类型名) + * @author yi.zhang + * @time 2017年6月30日 下午2:16:02 + * @param table 表名 + * @return + */ + public Map queryColumns(String table){ + try { + MongoCollection collection = session.getCollection(table); + if (collection == null) { + return null; + } + Map reflect = new HashMap(); + FindIterable documents = collection.find(); + Document document = documents.first(); + if(document==null){ + return reflect; + } + for (String column : document.keySet()) { + Object value = document.get(column); + String type = "string"; + if(value instanceof Integer){ + type = "int"; + } + if(value instanceof Long){ + type = "long"; + } + if(value instanceof Double){ + type = "double"; + } + if(value instanceof Boolean){ + type = "boolean"; + } + if(value instanceof Date){ + type = "date"; + } + reflect.put(column, type); + } + return reflect; + } catch (Exception e) { + logger.error("--mongodb columns error!",e); + } + return null; + } + /** + * @decription 查询数据库表名 + * @author yi.zhang + * @time 2017年6月30日 下午2:16:02 + * @param table 表名 + * @return + */ + public List queryTables(){ + try { + MongoIterable collection = session.listCollectionNames(); + if (collection == null) { + return null; + } + List tables = new ArrayList(); + MongoCursor cursor = collection.iterator(); + while(cursor.hasNext()){ + String table = cursor.next(); + tables.add(table); + } + return tables; + } catch (Exception e) { + logger.error("--mongodb tables error!",e); + } + return null; + } +} \ No newline at end of file diff --git a/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/service/pojo/RealTimeJob.java b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/service/pojo/RealTimeJob.java new file mode 100644 index 000000000..ed978c45f --- /dev/null +++ b/lts-examples/lts-example-springboot/src/main/java/com/github/ltsopensource/example/service/pojo/RealTimeJob.java @@ -0,0 +1,107 @@ +package com.github.ltsopensource.example.service.pojo; + +import java.io.Serializable; +import java.util.Date; + +public class RealTimeJob implements Serializable { + private static final long serialVersionUID = 2336237798759634903L; + private int id; + private String name; + private int status; + private double price; + private boolean flag; + private long total; + private int priority; + private String code; + private String msg; + private String content; + private int retry_times; + private int max_retry_times; + private Date updatetime; + private Date createtime; + + public int getId() { + return id; + } + public void setId(int id) { + this.id = id; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public int getStatus() { + return status; + } + public void setStatus(int status) { + this.status = status; + } + public double getPrice() { + return price; + } + public void setPrice(double price) { + this.price = price; + } + public boolean isFlag() { + return flag; + } + public void setFlag(boolean flag) { + this.flag = flag; + } + public long getTotal() { + return total; + } + public void setTotal(long total) { + this.total = total; + } + public int getPriority() { + return priority; + } + public void setPriority(int priority) { + this.priority = priority; + } + public String getCode() { + return code; + } + public void setCode(String code) { + this.code = code; + } + public String getMsg() { + return msg; + } + public void setMsg(String msg) { + this.msg = msg; + } + public String getContent() { + return content; + } + public void setContent(String content) { + this.content = content; + } + public int getRetry_times() { + return retry_times; + } + public void setRetry_times(int retry_times) { + this.retry_times = retry_times; + } + public int getMax_retry_times() { + return max_retry_times; + } + public void setMax_retry_times(int max_retry_times) { + this.max_retry_times = max_retry_times; + } + public Date getUpdatetime() { + return updatetime; + } + public void setUpdatetime(Date updatetime) { + this.updatetime = updatetime; + } + public Date getCreatetime() { + return createtime; + } + public void setCreatetime(Date createtime) { + this.createtime = createtime; + } +} diff --git a/lts-examples/lts-example-springboot/src/main/resources/application.properties b/lts-examples/lts-example-springboot/src/main/resources/application.properties new file mode 100644 index 000000000..c6b724dca --- /dev/null +++ b/lts-examples/lts-example-springboot/src/main/resources/application.properties @@ -0,0 +1,41 @@ +# web port +server.port=8082 +#\u6ce8\u518c\u4e2d\u5fc3\u53ca\u96c6\u7fa4\u914d\u7f6e +lts.cluster.name=css-vsim-web +lts.job.fail.store=mapdb +lts.registry-address=zookeeper://127.0.0.1:2181 +#lts.registry-address=redis://127.0.0.1:6379 +#JobClient\u914d\u7f6e +lts.jobclient.node-group=css-job-client +lts.jobclient.use-retry-client=true +#JobTracker\u914d\u7f6e{\u65e5\u5fd7\u8bb0\u5f55(mongo|mysql|console[\u9ed8\u8ba4]),\u961f\u5217\u5b58\u50a8(mongo|mysql[\u9ed8\u8ba4])} +lts.jobtracker.listen-port=35001 +lts.jobtracker.configs.job.logger=mongo +lts.jobtracker.configs.job.queue=mongo +lts.jobtracker.configs.jdbc.url=jdbc:mysql://127.0.0.1:3306/lts +lts.jobtracker.configs.jdbc.username=root +lts.jobtracker.configs.jdbc.password=root +lts.jobtracker.configs.mongo.addresses=127.0.0.1:27017 +lts.jobtracker.configs.mongo.database=lts +lts.jobtracker.configs.mongo.username= +lts.jobtracker.configs.mongo.password= + +#TaskTracker\u914d\u7f6e +lts.tasktracker.work-threads=64 +lts.tasktracker.node-group=css-task-tracker +#lts.tasktracker.dispatch-runner.enable=true +#lts.tasktracker.dispatch-runner.shard-value=taskId +############################################################################################### +lts.db.driverName=com.mysql.jdbc.Driver +lts.db.url=jdbc:mysql://localhost:3306/lts-test-job?useUnicode=true&characterEncoding=UTF-8 +lts.db.username=root +lts.db.password=root +lts.db.max_pool_size=10 +lts.db.init_pool_size=2 +############################################################################################### +lts.mongodb.servers=localhost:27017 +lts.mongodb.database=admin +lts.mongodb.schema=lts-test-job +lts.mongodb.username=root +lts.mongodb.password=root +lts.mongodb.max_wait_time=1440 \ No newline at end of file diff --git a/lts-examples/lts-example-springboot/src/main/resources/log4j.properties b/lts-examples/lts-example-springboot/src/main/resources/log4j.properties new file mode 100644 index 000000000..a98c1d1d2 --- /dev/null +++ b/lts-examples/lts-example-springboot/src/main/resources/log4j.properties @@ -0,0 +1,7 @@ + +log4j.rootLogger=INFO,stdout + +log4j.appender.stdout.Threshold=INFO +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d [%t] (%F:%L) %-5p %c %x - %m%n \ No newline at end of file diff --git a/lts-examples/lts-example-springboot/src/main/resources/table_sql_template.sql b/lts-examples/lts-example-springboot/src/main/resources/table_sql_template.sql new file mode 100644 index 000000000..68d1a9328 --- /dev/null +++ b/lts-examples/lts-example-springboot/src/main/resources/table_sql_template.sql @@ -0,0 +1,17 @@ +create table if not exists `{job_table}` ( + `id` int(11) not null auto_increment, + `name` varchar(255) default null, + `status` int(11) default null, + `price` double(10,4) default null, + `flag` varchar(5) default null, + `total` decimal(20,0) default null, + `priority` int(11) comment '优先级,(数值越大,优先级越低)', + `code` varchar(32) comment '消息编码', + `msg` text comment '消息', + `retry_times` int(11) comment '重试次数', + `max_retry_times` int(11) default '0' comment '最大重试次数', + `content` text default null, + `updatetime` datetime default null, + `createtime` datetime default current_timestamp(), + primary key (`id`) +) engine=InnoDB default charset=utf8; \ No newline at end of file diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktarcker-springboot/pom.xml b/lts-examples/lts-example-tasktracker/lts-example-tasktarcker-springboot/pom.xml new file mode 100644 index 000000000..e26041116 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktarcker-springboot/pom.xml @@ -0,0 +1,25 @@ + + + + lts-example-tasktracker + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + + lts-example-tasktarcker-springboot + + + + org.springframework.boot + spring-boot + + + org.springframework.boot + spring-boot-autoconfigure + + + + diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktarcker-springboot/src/main/java/com/github/ltsopensource/example/springboot/Application.java b/lts-examples/lts-example-tasktracker/lts-example-tasktarcker-springboot/src/main/java/com/github/ltsopensource/example/springboot/Application.java new file mode 100644 index 000000000..7720961e5 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktarcker-springboot/src/main/java/com/github/ltsopensource/example/springboot/Application.java @@ -0,0 +1,20 @@ +package com.github.ltsopensource.example.springboot; + +import com.github.ltsopensource.spring.boot.annotation.EnableTaskTracker; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +/** + * @author Robert HG (254963746@qq.com) on 4/9/16. + */ +@SpringBootApplication +@EnableTaskTracker +@ComponentScan("com.github.ltsopensource.example") +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktarcker-springboot/src/main/java/com/github/ltsopensource/example/springboot/JobRunnerImpl.java b/lts-examples/lts-example-tasktracker/lts-example-tasktarcker-springboot/src/main/java/com/github/ltsopensource/example/springboot/JobRunnerImpl.java new file mode 100644 index 000000000..829387a92 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktarcker-springboot/src/main/java/com/github/ltsopensource/example/springboot/JobRunnerImpl.java @@ -0,0 +1,35 @@ +package com.github.ltsopensource.example.springboot; + +import com.github.ltsopensource.core.domain.Action; +import com.github.ltsopensource.core.logger.Logger; +import com.github.ltsopensource.core.logger.LoggerFactory; +import com.github.ltsopensource.spring.boot.annotation.JobRunner4TaskTracker; +import com.github.ltsopensource.tasktracker.Result; +import com.github.ltsopensource.tasktracker.logger.BizLogger; +import com.github.ltsopensource.tasktracker.runner.JobContext; +import com.github.ltsopensource.tasktracker.runner.JobRunner; + +/** + * @author Robert HG (254963746@qq.com) on 4/9/16. + */ +@JobRunner4TaskTracker +public class JobRunnerImpl implements JobRunner { + private static final Logger LOGGER = LoggerFactory.getLogger(JobRunnerImpl.class); + + @Override + public Result run(JobContext jobContext) throws Throwable { + try { + BizLogger bizLogger = jobContext.getBizLogger(); + + // TODO 业务逻辑 + LOGGER.info("我要执行:" + jobContext); + // 会发送到 LTS (JobTracker上) + bizLogger.info("测试,业务日志啊啊啊啊啊"); + + } catch (Exception e) { + LOGGER.info("Run job failed!", e); + return new Result(Action.EXECUTE_FAILED, e.getMessage()); + } + return new Result(Action.EXECUTE_SUCCESS, "执行成功了,哈哈"); + } +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktarcker-springboot/src/main/java/com/github/ltsopensource/example/springboot/MasterNodeChangeListener.java b/lts-examples/lts-example-tasktracker/lts-example-tasktarcker-springboot/src/main/java/com/github/ltsopensource/example/springboot/MasterNodeChangeListener.java new file mode 100644 index 000000000..5883bbcb0 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktarcker-springboot/src/main/java/com/github/ltsopensource/example/springboot/MasterNodeChangeListener.java @@ -0,0 +1,31 @@ +package com.github.ltsopensource.example.springboot; + +import com.github.ltsopensource.core.cluster.Node; +import com.github.ltsopensource.core.commons.utils.StringUtils; +import com.github.ltsopensource.core.listener.MasterChangeListener; +import com.github.ltsopensource.core.logger.Logger; +import com.github.ltsopensource.core.logger.LoggerFactory; +import com.github.ltsopensource.spring.boot.annotation.MasterNodeListener; + +/** + * @author Robert HG (254963746@qq.com) on 4/9/16. + */ +@MasterNodeListener +public class MasterNodeChangeListener implements MasterChangeListener { + + private static final Logger LOGGER = LoggerFactory.getLogger(MasterNodeChangeListener.class); + + /** + * @param master master节点 + * @param isMaster 表示当前节点是不是master节点 + */ + @Override + public void change(Node master, boolean isMaster) { + // 一个节点组master节点变化后的处理 , 譬如我多个JobClient, 但是有些事情只想只有一个节点能做。 + if (isMaster) { + LOGGER.info("我变成了节点组中的master节点了, 恭喜, 我要放大招了"); + } else { + LOGGER.info(StringUtils.format("master节点变成了{},不是我,我不能放大招,要猥琐", master)); + } + } +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktarcker-springboot/src/main/resources/application.properties b/lts-examples/lts-example-tasktracker/lts-example-tasktarcker-springboot/src/main/resources/application.properties new file mode 100644 index 000000000..423e3b182 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktarcker-springboot/src/main/resources/application.properties @@ -0,0 +1,7 @@ +lts.tasktracker.cluster-name=test_cluster +lts.tasktracker.registry-address=zookeeper://127.0.0.1:2181 +#lts.tasktracker.work-threads=64 +lts.tasktracker.node-group=test_trade_TaskTracker +#lts.tasktracker.dispatch-runner.enable=true +#lts.tasktracker.dispatch-runner.shard-value=taskId +lts.tasktracker.configs.job.fail.store=mapdb \ No newline at end of file diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktarcker-springboot/src/main/resources/log4j.properties b/lts-examples/lts-example-tasktracker/lts-example-tasktarcker-springboot/src/main/resources/log4j.properties new file mode 100644 index 000000000..a98c1d1d2 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktarcker-springboot/src/main/resources/log4j.properties @@ -0,0 +1,7 @@ + +log4j.rootLogger=INFO,stdout + +log4j.appender.stdout.Threshold=INFO +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d [%t] (%F:%L) %-5p %c %x - %m%n \ No newline at end of file diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-java/pom.xml b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-java/pom.xml new file mode 100644 index 000000000..226e45f1c --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-java/pom.xml @@ -0,0 +1,15 @@ + + + + lts-example-tasktracker + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + + lts-example-tasktracker-java + + + diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-java/src/main/java/com/github/ltsopensource/example/java/Main.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-java/src/main/java/com/github/ltsopensource/example/java/Main.java new file mode 100644 index 000000000..07777b002 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-java/src/main/java/com/github/ltsopensource/example/java/Main.java @@ -0,0 +1,35 @@ +package com.github.ltsopensource.example.java; + +import com.github.ltsopensource.tasktracker.TaskTracker; +import com.github.ltsopensource.tasktracker.TaskTrackerBuilder; + +/** + * @author Robert HG (254963746@qq.com) on 4/17/16. + */ +public class Main { + + public static void main(String[] args) { + +// final TaskTracker taskTracker = new TaskTracker(); +// // 任务执行类,实现JobRunner 接口 +// taskTracker.setJobRunnerClass(TestJobRunner.class); +// taskTracker.setRegistryAddress("zookeeper://127.0.0.1:2181"); +// taskTracker.setNodeGroup("test_trade_TaskTracker"); // 同一个TaskTracker集群这个名字相同 +// taskTracker.setClusterName("test_cluster"); +// taskTracker.setWorkThreads(64); +// taskTracker.addConfig("job.fail.store", "mapdb"); + + final TaskTracker taskTracker = new TaskTrackerBuilder() + .setPropertiesConfigure("lts.properties") + .build(); + + taskTracker.start(); + + Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { + @Override + public void run() { + taskTracker.stop(); + } + })); + } +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-java/src/main/java/com/github/ltsopensource/example/java/TestJobRunner.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-java/src/main/java/com/github/ltsopensource/example/java/TestJobRunner.java new file mode 100644 index 000000000..53be7dece --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-java/src/main/java/com/github/ltsopensource/example/java/TestJobRunner.java @@ -0,0 +1,35 @@ +package com.github.ltsopensource.example.java; + +import com.github.ltsopensource.core.domain.Action; +import com.github.ltsopensource.core.logger.Logger; +import com.github.ltsopensource.core.logger.LoggerFactory; +import com.github.ltsopensource.tasktracker.Result; +import com.github.ltsopensource.tasktracker.logger.BizLogger; +import com.github.ltsopensource.tasktracker.runner.JobContext; +import com.github.ltsopensource.tasktracker.runner.JobRunner; + +/** + * @author Robert HG (254963746@qq.com) on 4/17/16. + */ +public class TestJobRunner implements JobRunner { + + private static final Logger LOGGER = LoggerFactory.getLogger(TestJobRunner.class); + + @Override + public Result run(JobContext jobContext) throws Throwable { + try { +// BizLogger bizLogger = LtsLoggerFactory.getBizLogger(); + BizLogger bizLogger = jobContext.getBizLogger(); + + // TODO 业务逻辑 + LOGGER.info("我要执行:" + jobContext); + // 会发送到 LTS (JobTracker上) + bizLogger.info("测试,业务日志啊啊啊啊啊"); + + } catch (Exception e) { + LOGGER.info("Run job failed!", e); + return new Result(Action.EXECUTE_FAILED, e.getMessage()); + } + return new Result(Action.EXECUTE_SUCCESS, "执行成功了,哈哈"); + } +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-java/src/main/resources/log4j.properties b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-java/src/main/resources/log4j.properties new file mode 100644 index 000000000..a98c1d1d2 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-java/src/main/resources/log4j.properties @@ -0,0 +1,7 @@ + +log4j.rootLogger=INFO,stdout + +log4j.appender.stdout.Threshold=INFO +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d [%t] (%F:%L) %-5p %c %x - %m%n \ No newline at end of file diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-java/src/main/resources/lts.properties b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-java/src/main/resources/lts.properties new file mode 100644 index 000000000..20d223bad --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-java/src/main/resources/lts.properties @@ -0,0 +1,8 @@ +lts.tasktracker.cluster-name=test_cluster +lts.tasktracker.registry-address=zookeeper://127.0.0.1:2181 +#lts.tasktracker.work-threads=64 +lts.tasktracker.node-group=test_trade_TaskTracker +#lts.tasktracker.dispatch-runner.enable=true +#lts.tasktracker.dispatch-runner.shard-value=taskId +lts.tasktracker.configs.job.fail.store=mapdb +lts.tasktracker.job-runner-class=com.github.ltsopensource.example.java.TestJobRunner \ No newline at end of file diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation-shard/pom.xml b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation-shard/pom.xml new file mode 100644 index 000000000..14d1cac28 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation-shard/pom.xml @@ -0,0 +1,37 @@ + + + + lts-example-tasktracker + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + + lts-example-tasktracker-spring-annotation-shard + + + + org.springframework + spring-core + ${springframework.version} + + + org.springframework + spring-beans + ${springframework.version} + + + org.springframework + spring-context + ${springframework.version} + + + org.springframework + spring-context-support + ${springframework.version} + + + + diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation-shard/src/main/java/com/github/ltsopensource/example/JobScheduler.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation-shard/src/main/java/com/github/ltsopensource/example/JobScheduler.java new file mode 100644 index 000000000..f3d5c598e --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation-shard/src/main/java/com/github/ltsopensource/example/JobScheduler.java @@ -0,0 +1,58 @@ +package com.github.ltsopensource.example; + +import com.github.ltsopensource.core.domain.Action; +import com.github.ltsopensource.core.domain.Job; +import com.github.ltsopensource.core.logger.Logger; +import com.github.ltsopensource.core.logger.LoggerFactory; +import com.github.ltsopensource.spring.tasktracker.JobRunnerItem; +import com.github.ltsopensource.spring.tasktracker.LTS; +import com.github.ltsopensource.tasktracker.Result; +import com.github.ltsopensource.tasktracker.logger.BizLogger; +import com.github.ltsopensource.tasktracker.runner.LtsLoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Robert HG (254963746@qq.com) on 10/20/15. + */ +@LTS +public class JobScheduler { + + private static final Logger LOGGER = LoggerFactory.getLogger(JobScheduler.class); + + @Autowired + SpringBean springBean; + + @JobRunnerItem(shardValue = "111") + public Result runJob1(Job job) throws Throwable { + try { + Thread.sleep(1000L); + + springBean.hello(); + + LOGGER.info("runJob1 我要执行:" + job); + BizLogger bizLogger = LtsLoggerFactory.getBizLogger(); + // 会发送到 LTS (JobTracker上) + bizLogger.info("测试,业务日志啊啊啊啊啊"); + + } catch (Exception e) { + LOGGER.info("Run job failed!", e); + return new Result(Action.EXECUTE_LATER, e.getMessage()); + } + return new Result(Action.EXECUTE_SUCCESS, "执行成功了,哈哈"); + } + + @JobRunnerItem(shardValue = "222") + public void runJob2() throws Throwable { + try { + springBean.hello(); + + LOGGER.info("runJob2 我要执行"); + BizLogger bizLogger = LtsLoggerFactory.getBizLogger(); + // 会发送到 LTS (JobTracker上) + bizLogger.info("测试,业务日志啊啊啊啊啊"); + } catch (Exception e) { + LOGGER.info("Run job failed!", e); + } + } + +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation-shard/src/main/java/com/github/ltsopensource/example/JobScheduler2.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation-shard/src/main/java/com/github/ltsopensource/example/JobScheduler2.java new file mode 100644 index 000000000..342480301 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation-shard/src/main/java/com/github/ltsopensource/example/JobScheduler2.java @@ -0,0 +1,58 @@ +package com.github.ltsopensource.example; + +import com.github.ltsopensource.core.domain.Action; +import com.github.ltsopensource.core.domain.Job; +import com.github.ltsopensource.core.logger.Logger; +import com.github.ltsopensource.core.logger.LoggerFactory; +import com.github.ltsopensource.spring.tasktracker.JobRunnerItem; +import com.github.ltsopensource.spring.tasktracker.LTS; +import com.github.ltsopensource.tasktracker.Result; +import com.github.ltsopensource.tasktracker.logger.BizLogger; +import com.github.ltsopensource.tasktracker.runner.LtsLoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Robert HG (254963746@qq.com) on 10/20/15. + */ +@LTS +public class JobScheduler2 { + + private static final Logger LOGGER = LoggerFactory.getLogger(JobScheduler.class); + + @Autowired + SpringBean springBean; + + @JobRunnerItem(shardValue = "333") + public Result runJob1(Job job) throws Throwable { + try { + Thread.sleep(1000L); + + springBean.hello(); + + LOGGER.info("runJob3 我要执行:" + job); + BizLogger bizLogger = LtsLoggerFactory.getBizLogger(); + // 会发送到 LTS (JobTracker上) + bizLogger.info("测试,业务日志啊啊啊啊啊"); + + } catch (Exception e) { + LOGGER.info("Run job failed!", e); + return new Result(Action.EXECUTE_LATER, e.getMessage()); + } + return new Result(Action.EXECUTE_SUCCESS, "执行成功了,哈哈"); + } + + @JobRunnerItem(shardValue = "444") + public void runJob2() throws Throwable { + try { + springBean.hello(); + + LOGGER.info("runJob4 我要执行"); + BizLogger bizLogger = LtsLoggerFactory.getBizLogger(); + // 会发送到 LTS (JobTracker上) + bizLogger.info("测试,业务日志啊啊啊啊啊"); + } catch (Exception e) { + LOGGER.info("Run job failed!", e); + } + } + +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation-shard/src/main/java/com/github/ltsopensource/example/Main.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation-shard/src/main/java/com/github/ltsopensource/example/Main.java new file mode 100644 index 000000000..b31630409 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation-shard/src/main/java/com/github/ltsopensource/example/Main.java @@ -0,0 +1,13 @@ +package com.github.ltsopensource.example; + +import org.springframework.context.support.ClassPathXmlApplicationContext; + +/** + * @author Robert HG (254963746@qq.com) on 4/18/16. + */ +public class Main { + + public static void main(String[] args) { + new ClassPathXmlApplicationContext("/lts-tasktracker-shard-annotaion.xml"); + } +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation-shard/src/main/java/com/github/ltsopensource/example/SpringBean.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation-shard/src/main/java/com/github/ltsopensource/example/SpringBean.java new file mode 100644 index 000000000..29be8e230 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation-shard/src/main/java/com/github/ltsopensource/example/SpringBean.java @@ -0,0 +1,15 @@ +package com.github.ltsopensource.example; + +import org.springframework.stereotype.Component; + +/** + * 测试bean 注入 + * @author Robert HG (254963746@qq.com) on 8/4/15. + */ +@Component +public class SpringBean { + + public void hello(){ + System.out.println("我是SpringBean,我执行了"); + } +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation-shard/src/main/resources/log4j.properties b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation-shard/src/main/resources/log4j.properties new file mode 100644 index 000000000..a98c1d1d2 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation-shard/src/main/resources/log4j.properties @@ -0,0 +1,7 @@ + +log4j.rootLogger=INFO,stdout + +log4j.appender.stdout.Threshold=INFO +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d [%t] (%F:%L) %-5p %c %x - %m%n \ No newline at end of file diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation-shard/src/main/resources/lts-tasktracker-shard-annotaion.xml b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation-shard/src/main/resources/lts-tasktracker-shard-annotaion.xml new file mode 100644 index 000000000..36ecf5265 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation-shard/src/main/resources/lts-tasktracker-shard-annotaion.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + mapdb + + + + + + + + + \ No newline at end of file diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/pom.xml b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/pom.xml new file mode 100644 index 000000000..7775ae6dd --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/pom.xml @@ -0,0 +1,37 @@ + + + + lts-example-tasktracker + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + + lts-example-tasktracker-spring-annotation + + + + org.springframework + spring-core + ${springframework.version} + + + org.springframework + spring-beans + ${springframework.version} + + + org.springframework + spring-context + ${springframework.version} + + + org.springframework + spring-context-support + ${springframework.version} + + + + diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/src/main/java/com/github/ltsopensource/example/Main.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/src/main/java/com/github/ltsopensource/example/Main.java new file mode 100644 index 000000000..a4a442e86 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/src/main/java/com/github/ltsopensource/example/Main.java @@ -0,0 +1,15 @@ +package com.github.ltsopensource.example; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +/** + * @author Robert HG (254963746@qq.com) on 4/22/16. + */ +public class Main { + + public static void main(String[] args) { + ApplicationContext context = new ClassPathXmlApplicationContext("/lts-tasktracker.xml"); + } + +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/src/main/java/com/github/ltsopensource/example/SpringAnnotationJobRunner.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/src/main/java/com/github/ltsopensource/example/SpringAnnotationJobRunner.java new file mode 100644 index 000000000..66cd81740 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/src/main/java/com/github/ltsopensource/example/SpringAnnotationJobRunner.java @@ -0,0 +1,43 @@ +package com.github.ltsopensource.example; + +import com.github.ltsopensource.core.domain.Action; +import com.github.ltsopensource.core.logger.Logger; +import com.github.ltsopensource.core.logger.LoggerFactory; +import com.github.ltsopensource.tasktracker.Result; +import com.github.ltsopensource.tasktracker.logger.BizLogger; +import com.github.ltsopensource.tasktracker.runner.JobContext; +import com.github.ltsopensource.tasktracker.runner.JobRunner; +import com.github.ltsopensource.tasktracker.runner.LtsLoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Robert HG (254963746@qq.com) on 8/19/14. + */ +public class SpringAnnotationJobRunner implements JobRunner { + + private static final Logger LOGGER = LoggerFactory.getLogger(SpringAnnotationJobRunner.class); + + @Autowired + SpringBean springBean; + + @Override + public Result run(JobContext jobContext) throws Throwable { + try { + Thread.sleep(1000L); + + springBean.hello(); + + // TODO 业务逻辑 + LOGGER.info("我要执行:" + jobContext); + BizLogger bizLogger = LtsLoggerFactory.getBizLogger(); + // 会发送到 LTS (JobTracker上) + bizLogger.info("测试,业务日志啊啊啊啊啊"); + + } catch (Exception e) { + LOGGER.info("Run job failed!", e); + return new Result(Action.EXECUTE_LATER, e.getMessage()); + } + return new Result(Action.EXECUTE_SUCCESS, "执行成功了,哈哈"); + } + +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/src/main/java/com/github/ltsopensource/example/SpringBean.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/src/main/java/com/github/ltsopensource/example/SpringBean.java new file mode 100644 index 000000000..29be8e230 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/src/main/java/com/github/ltsopensource/example/SpringBean.java @@ -0,0 +1,15 @@ +package com.github.ltsopensource.example; + +import org.springframework.stereotype.Component; + +/** + * 测试bean 注入 + * @author Robert HG (254963746@qq.com) on 8/4/15. + */ +@Component +public class SpringBean { + + public void hello(){ + System.out.println("我是SpringBean,我执行了"); + } +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/src/main/java/com/github/ltsopensource/example/TaskTrackerConfig.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/src/main/java/com/github/ltsopensource/example/TaskTrackerConfig.java new file mode 100644 index 000000000..37cd90534 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/src/main/java/com/github/ltsopensource/example/TaskTrackerConfig.java @@ -0,0 +1,35 @@ +package com.github.ltsopensource.example; + +import com.github.ltsopensource.spring.TaskTrackerAnnotationFactoryBean; +import com.github.ltsopensource.tasktracker.TaskTracker; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author Robert HG (254963746@qq.com) on 4/22/16. + */ +@Configuration +public class TaskTrackerConfig implements ApplicationContextAware { + + private ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext; + } + + @Bean(name = "taskTracker") + public TaskTracker getTaskTracker() throws Exception { + TaskTrackerAnnotationFactoryBean factoryBean = new TaskTrackerAnnotationFactoryBean(); + factoryBean.setApplicationContext(applicationContext); + factoryBean.setJobRunnerClass(SpringAnnotationJobRunner.class); + factoryBean.setLocations("lts.properties"); + factoryBean.afterPropertiesSet(); + factoryBean.start(); + return factoryBean.getObject(); + } + +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/src/main/resources/log4j.properties b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/src/main/resources/log4j.properties new file mode 100644 index 000000000..a98c1d1d2 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/src/main/resources/log4j.properties @@ -0,0 +1,7 @@ + +log4j.rootLogger=INFO,stdout + +log4j.appender.stdout.Threshold=INFO +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d [%t] (%F:%L) %-5p %c %x - %m%n \ No newline at end of file diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/src/main/resources/lts-tasktracker.xml b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/src/main/resources/lts-tasktracker.xml new file mode 100644 index 000000000..d63657d57 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/src/main/resources/lts-tasktracker.xml @@ -0,0 +1,15 @@ + + + + + + + + \ No newline at end of file diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/src/main/resources/lts.properties b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/src/main/resources/lts.properties new file mode 100644 index 000000000..423e3b182 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-annotation/src/main/resources/lts.properties @@ -0,0 +1,7 @@ +lts.tasktracker.cluster-name=test_cluster +lts.tasktracker.registry-address=zookeeper://127.0.0.1:2181 +#lts.tasktracker.work-threads=64 +lts.tasktracker.node-group=test_trade_TaskTracker +#lts.tasktracker.dispatch-runner.enable=true +#lts.tasktracker.dispatch-runner.shard-value=taskId +lts.tasktracker.configs.job.fail.store=mapdb \ No newline at end of file diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml-shard/pom.xml b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml-shard/pom.xml new file mode 100644 index 000000000..c58897970 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml-shard/pom.xml @@ -0,0 +1,37 @@ + + + + lts-example-tasktracker + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + + lts-example-tasktracker-spring-xml-shard + + + + org.springframework + spring-core + ${springframework.version} + + + org.springframework + spring-beans + ${springframework.version} + + + org.springframework + spring-context + ${springframework.version} + + + org.springframework + spring-context-support + ${springframework.version} + + + + diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml-shard/src/main/java/com/github/ltsopensource/example/Main.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml-shard/src/main/java/com/github/ltsopensource/example/Main.java new file mode 100644 index 000000000..6ebf365a8 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml-shard/src/main/java/com/github/ltsopensource/example/Main.java @@ -0,0 +1,14 @@ +package com.github.ltsopensource.example; + +import org.springframework.context.support.ClassPathXmlApplicationContext; + +/** + * @author Robert HG (254963746@qq.com) on 4/18/16. + */ +public class Main { + + public static void main(String[] args) { + new ClassPathXmlApplicationContext("/lts-tasktracker-shard-xml.xml"); + + } +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml-shard/src/main/java/com/github/ltsopensource/example/SpringBean.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml-shard/src/main/java/com/github/ltsopensource/example/SpringBean.java new file mode 100644 index 000000000..29be8e230 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml-shard/src/main/java/com/github/ltsopensource/example/SpringBean.java @@ -0,0 +1,15 @@ +package com.github.ltsopensource.example; + +import org.springframework.stereotype.Component; + +/** + * 测试bean 注入 + * @author Robert HG (254963746@qq.com) on 8/4/15. + */ +@Component +public class SpringBean { + + public void hello(){ + System.out.println("我是SpringBean,我执行了"); + } +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml-shard/src/main/java/com/github/ltsopensource/example/XmlJobScheduler.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml-shard/src/main/java/com/github/ltsopensource/example/XmlJobScheduler.java new file mode 100644 index 000000000..e7ba363ed --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml-shard/src/main/java/com/github/ltsopensource/example/XmlJobScheduler.java @@ -0,0 +1,55 @@ +package com.github.ltsopensource.example; + +import com.github.ltsopensource.core.domain.Action; +import com.github.ltsopensource.core.domain.Job; +import com.github.ltsopensource.core.logger.Logger; +import com.github.ltsopensource.core.logger.LoggerFactory; +import com.github.ltsopensource.tasktracker.Result; +import com.github.ltsopensource.tasktracker.logger.BizLogger; +import com.github.ltsopensource.tasktracker.runner.LtsLoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Robert HG (254963746@qq.com)on 12/21/15. + */ +public class XmlJobScheduler { + + private static final Logger LOGGER = LoggerFactory.getLogger(XmlJobScheduler.class); + + @Autowired + SpringBean springBean; + + public Result runJob1(Job job) throws Throwable { + try { + Thread.sleep(1000L); + + springBean.hello(); + + LOGGER.info("runJob1 我要执行:" + job); + BizLogger bizLogger = LtsLoggerFactory.getBizLogger(); + // 会发送到 LTS (JobTracker上) + bizLogger.info("测试,业务日志啊啊啊啊啊"); + + } catch (Exception e) { + LOGGER.info("Run job failed!", e); + return new Result(Action.EXECUTE_LATER, e.getMessage()); + } + return new Result(Action.EXECUTE_SUCCESS, "执行成功了,哈哈"); + } + + public Result runJob2() throws Throwable { + try { + springBean.hello(); + + LOGGER.info("runJob2 我要执行"); + BizLogger bizLogger = LtsLoggerFactory.getBizLogger(); + // 会发送到 LTS (JobTracker上) + bizLogger.info("测试,业务日志啊啊啊啊啊"); + } catch (Exception e) { + LOGGER.info("Run job failed!", e); + return new Result(Action.EXECUTE_LATER, e.getMessage()); + } + return new Result(Action.EXECUTE_SUCCESS, "执行成功了,哈哈"); + } + +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml-shard/src/main/resources/log4j.properties b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml-shard/src/main/resources/log4j.properties new file mode 100644 index 000000000..a98c1d1d2 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml-shard/src/main/resources/log4j.properties @@ -0,0 +1,7 @@ + +log4j.rootLogger=INFO,stdout + +log4j.appender.stdout.Threshold=INFO +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d [%t] (%F:%L) %-5p %c %x - %m%n \ No newline at end of file diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml-shard/src/main/resources/lts-tasktracker-shard-xml.xml b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml-shard/src/main/resources/lts-tasktracker-shard-xml.xml new file mode 100644 index 000000000..7a7a5b953 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml-shard/src/main/resources/lts-tasktracker-shard-xml.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + mapdb + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml/pom.xml b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml/pom.xml new file mode 100644 index 000000000..7d04dfb3f --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml/pom.xml @@ -0,0 +1,37 @@ + + + + lts-example-tasktracker + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + + lts-example-tasktracker-spring-xml + + + + org.springframework + spring-core + ${springframework.version} + + + org.springframework + spring-beans + ${springframework.version} + + + org.springframework + spring-context + ${springframework.version} + + + org.springframework + spring-context-support + ${springframework.version} + + + + diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml/src/main/java/com/github/ltsopensource/example/spring/Main.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml/src/main/java/com/github/ltsopensource/example/spring/Main.java new file mode 100644 index 000000000..894558b42 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml/src/main/java/com/github/ltsopensource/example/spring/Main.java @@ -0,0 +1,15 @@ +package com.github.ltsopensource.example.spring; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +/** + * @author Robert HG (254963746@qq.com) on 4/18/16. + */ +public class Main { + + public static void main(String[] args) { + ApplicationContext context = new ClassPathXmlApplicationContext("/lts-tasktracker.xml"); + + } +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml/src/main/java/com/github/ltsopensource/example/spring/SpringAnnotationJobRunner.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml/src/main/java/com/github/ltsopensource/example/spring/SpringAnnotationJobRunner.java new file mode 100644 index 000000000..db2ad2630 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml/src/main/java/com/github/ltsopensource/example/spring/SpringAnnotationJobRunner.java @@ -0,0 +1,43 @@ +package com.github.ltsopensource.example.spring; + +import com.github.ltsopensource.core.domain.Action; +import com.github.ltsopensource.core.logger.Logger; +import com.github.ltsopensource.core.logger.LoggerFactory; +import com.github.ltsopensource.tasktracker.Result; +import com.github.ltsopensource.tasktracker.logger.BizLogger; +import com.github.ltsopensource.tasktracker.runner.JobContext; +import com.github.ltsopensource.tasktracker.runner.JobRunner; +import com.github.ltsopensource.tasktracker.runner.LtsLoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Robert HG (254963746@qq.com) on 8/19/14. + */ +public class SpringAnnotationJobRunner implements JobRunner { + + private static final Logger LOGGER = LoggerFactory.getLogger(SpringAnnotationJobRunner.class); + + @Autowired + SpringBean springBean; + + @Override + public Result run(JobContext jobContext) throws Throwable { + try { + Thread.sleep(1000L); + + springBean.hello(); + + // TODO 业务逻辑 + LOGGER.info("我要执行:" + jobContext); + BizLogger bizLogger = LtsLoggerFactory.getBizLogger(); + // 会发送到 LTS (JobTracker上) + bizLogger.info("测试,业务日志啊啊啊啊啊"); + + } catch (Exception e) { + LOGGER.info("Run job failed!", e); + return new Result(Action.EXECUTE_LATER, e.getMessage()); + } + return new Result(Action.EXECUTE_SUCCESS, "执行成功了,哈哈"); + } + +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml/src/main/java/com/github/ltsopensource/example/spring/SpringBean.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml/src/main/java/com/github/ltsopensource/example/spring/SpringBean.java new file mode 100644 index 000000000..0f35f3f3c --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml/src/main/java/com/github/ltsopensource/example/spring/SpringBean.java @@ -0,0 +1,15 @@ +package com.github.ltsopensource.example.spring; + +import org.springframework.stereotype.Component; + +/** + * 测试bean 注入 + * @author Robert HG (254963746@qq.com) on 8/4/15. + */ +@Component +public class SpringBean { + + public void hello(){ + System.out.println("我是SpringBean,我执行了"); + } +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml/src/main/resources/log4j.properties b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml/src/main/resources/log4j.properties new file mode 100644 index 000000000..a98c1d1d2 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml/src/main/resources/log4j.properties @@ -0,0 +1,7 @@ + +log4j.rootLogger=INFO,stdout + +log4j.appender.stdout.Threshold=INFO +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d [%t] (%F:%L) %-5p %c %x - %m%n \ No newline at end of file diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml/src/main/resources/lts-tasktracker.xml b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml/src/main/resources/lts-tasktracker.xml new file mode 100644 index 000000000..695729665 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-spring-xml/src/main/resources/lts-tasktracker.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + mapdb + + + + + + + + \ No newline at end of file diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-springboot-shard/pom.xml b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-springboot-shard/pom.xml new file mode 100644 index 000000000..970e0725b --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-springboot-shard/pom.xml @@ -0,0 +1,25 @@ + + + + lts-example-tasktracker + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + + lts-example-tasktracker-springboot-shard + + + + org.springframework.boot + spring-boot + + + org.springframework.boot + spring-boot-autoconfigure + + + + diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-springboot-shard/src/main/java/com/github/ltsopensource/example/Application.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-springboot-shard/src/main/java/com/github/ltsopensource/example/Application.java new file mode 100644 index 000000000..211dd81c7 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-springboot-shard/src/main/java/com/github/ltsopensource/example/Application.java @@ -0,0 +1,20 @@ +package com.github.ltsopensource.example; + +import com.github.ltsopensource.spring.boot.annotation.EnableTaskTracker; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +/** + * @author Robert HG (254963746@qq.com) on 4/9/16. + */ +@SpringBootApplication +@EnableTaskTracker +@ComponentScan("com.github.ltsopensource.example") +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-springboot-shard/src/main/java/com/github/ltsopensource/example/JobScheduler.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-springboot-shard/src/main/java/com/github/ltsopensource/example/JobScheduler.java new file mode 100644 index 000000000..f3d5c598e --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-springboot-shard/src/main/java/com/github/ltsopensource/example/JobScheduler.java @@ -0,0 +1,58 @@ +package com.github.ltsopensource.example; + +import com.github.ltsopensource.core.domain.Action; +import com.github.ltsopensource.core.domain.Job; +import com.github.ltsopensource.core.logger.Logger; +import com.github.ltsopensource.core.logger.LoggerFactory; +import com.github.ltsopensource.spring.tasktracker.JobRunnerItem; +import com.github.ltsopensource.spring.tasktracker.LTS; +import com.github.ltsopensource.tasktracker.Result; +import com.github.ltsopensource.tasktracker.logger.BizLogger; +import com.github.ltsopensource.tasktracker.runner.LtsLoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Robert HG (254963746@qq.com) on 10/20/15. + */ +@LTS +public class JobScheduler { + + private static final Logger LOGGER = LoggerFactory.getLogger(JobScheduler.class); + + @Autowired + SpringBean springBean; + + @JobRunnerItem(shardValue = "111") + public Result runJob1(Job job) throws Throwable { + try { + Thread.sleep(1000L); + + springBean.hello(); + + LOGGER.info("runJob1 我要执行:" + job); + BizLogger bizLogger = LtsLoggerFactory.getBizLogger(); + // 会发送到 LTS (JobTracker上) + bizLogger.info("测试,业务日志啊啊啊啊啊"); + + } catch (Exception e) { + LOGGER.info("Run job failed!", e); + return new Result(Action.EXECUTE_LATER, e.getMessage()); + } + return new Result(Action.EXECUTE_SUCCESS, "执行成功了,哈哈"); + } + + @JobRunnerItem(shardValue = "222") + public void runJob2() throws Throwable { + try { + springBean.hello(); + + LOGGER.info("runJob2 我要执行"); + BizLogger bizLogger = LtsLoggerFactory.getBizLogger(); + // 会发送到 LTS (JobTracker上) + bizLogger.info("测试,业务日志啊啊啊啊啊"); + } catch (Exception e) { + LOGGER.info("Run job failed!", e); + } + } + +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-springboot-shard/src/main/java/com/github/ltsopensource/example/JobScheduler2.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-springboot-shard/src/main/java/com/github/ltsopensource/example/JobScheduler2.java new file mode 100644 index 000000000..342480301 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-springboot-shard/src/main/java/com/github/ltsopensource/example/JobScheduler2.java @@ -0,0 +1,58 @@ +package com.github.ltsopensource.example; + +import com.github.ltsopensource.core.domain.Action; +import com.github.ltsopensource.core.domain.Job; +import com.github.ltsopensource.core.logger.Logger; +import com.github.ltsopensource.core.logger.LoggerFactory; +import com.github.ltsopensource.spring.tasktracker.JobRunnerItem; +import com.github.ltsopensource.spring.tasktracker.LTS; +import com.github.ltsopensource.tasktracker.Result; +import com.github.ltsopensource.tasktracker.logger.BizLogger; +import com.github.ltsopensource.tasktracker.runner.LtsLoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Robert HG (254963746@qq.com) on 10/20/15. + */ +@LTS +public class JobScheduler2 { + + private static final Logger LOGGER = LoggerFactory.getLogger(JobScheduler.class); + + @Autowired + SpringBean springBean; + + @JobRunnerItem(shardValue = "333") + public Result runJob1(Job job) throws Throwable { + try { + Thread.sleep(1000L); + + springBean.hello(); + + LOGGER.info("runJob3 我要执行:" + job); + BizLogger bizLogger = LtsLoggerFactory.getBizLogger(); + // 会发送到 LTS (JobTracker上) + bizLogger.info("测试,业务日志啊啊啊啊啊"); + + } catch (Exception e) { + LOGGER.info("Run job failed!", e); + return new Result(Action.EXECUTE_LATER, e.getMessage()); + } + return new Result(Action.EXECUTE_SUCCESS, "执行成功了,哈哈"); + } + + @JobRunnerItem(shardValue = "444") + public void runJob2() throws Throwable { + try { + springBean.hello(); + + LOGGER.info("runJob4 我要执行"); + BizLogger bizLogger = LtsLoggerFactory.getBizLogger(); + // 会发送到 LTS (JobTracker上) + bizLogger.info("测试,业务日志啊啊啊啊啊"); + } catch (Exception e) { + LOGGER.info("Run job failed!", e); + } + } + +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-springboot-shard/src/main/java/com/github/ltsopensource/example/SpringBean.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-springboot-shard/src/main/java/com/github/ltsopensource/example/SpringBean.java new file mode 100644 index 000000000..29be8e230 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-springboot-shard/src/main/java/com/github/ltsopensource/example/SpringBean.java @@ -0,0 +1,15 @@ +package com.github.ltsopensource.example; + +import org.springframework.stereotype.Component; + +/** + * 测试bean 注入 + * @author Robert HG (254963746@qq.com) on 8/4/15. + */ +@Component +public class SpringBean { + + public void hello(){ + System.out.println("我是SpringBean,我执行了"); + } +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-springboot-shard/src/main/resources/application.properties b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-springboot-shard/src/main/resources/application.properties new file mode 100644 index 000000000..423e3b182 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-springboot-shard/src/main/resources/application.properties @@ -0,0 +1,7 @@ +lts.tasktracker.cluster-name=test_cluster +lts.tasktracker.registry-address=zookeeper://127.0.0.1:2181 +#lts.tasktracker.work-threads=64 +lts.tasktracker.node-group=test_trade_TaskTracker +#lts.tasktracker.dispatch-runner.enable=true +#lts.tasktracker.dispatch-runner.shard-value=taskId +lts.tasktracker.configs.job.fail.store=mapdb \ No newline at end of file diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-springboot-shard/src/main/resources/log4j.properties b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-springboot-shard/src/main/resources/log4j.properties new file mode 100644 index 000000000..a98c1d1d2 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-springboot-shard/src/main/resources/log4j.properties @@ -0,0 +1,7 @@ + +log4j.rootLogger=INFO,stdout + +log4j.appender.stdout.Threshold=INFO +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d [%t] (%F:%L) %-5p %c %x - %m%n \ No newline at end of file diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-tester/pom.xml b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-tester/pom.xml new file mode 100644 index 000000000..3627928ae --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-tester/pom.xml @@ -0,0 +1,15 @@ + + + + lts-example-tasktracker + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + + lts-example-tasktracker-tester + + + diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-tester/src/main/java/com/github/ltsopensource/example/TestJobRunner.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-tester/src/main/java/com/github/ltsopensource/example/TestJobRunner.java new file mode 100644 index 000000000..814e15fac --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-tester/src/main/java/com/github/ltsopensource/example/TestJobRunner.java @@ -0,0 +1,34 @@ +package com.github.ltsopensource.example; + +import com.github.ltsopensource.core.domain.Action; +import com.github.ltsopensource.core.logger.Logger; +import com.github.ltsopensource.core.logger.LoggerFactory; +import com.github.ltsopensource.tasktracker.Result; +import com.github.ltsopensource.tasktracker.logger.BizLogger; +import com.github.ltsopensource.tasktracker.runner.JobContext; +import com.github.ltsopensource.tasktracker.runner.JobRunner; + +/** + * @author Robert HG (254963746@qq.com) on 8/19/14. + */ +public class TestJobRunner implements JobRunner { + + private static final Logger LOGGER = LoggerFactory.getLogger(TestJobRunner.class); + + @Override + public Result run(JobContext jobContext) throws Throwable { + try { + BizLogger bizLogger = jobContext.getBizLogger(); + + // TODO 业务逻辑 + LOGGER.info("我要执行:" + jobContext); + // 会发送到 LTS (JobTracker上) + bizLogger.info("测试,业务日志啊啊啊啊啊"); + + } catch (Exception e) { + LOGGER.info("Run job failed!", e); + return new Result(Action.EXECUTE_FAILED, e.getMessage()); + } + return new Result(Action.EXECUTE_SUCCESS, "执行成功了,哈哈"); + } +} diff --git a/lts-examples/lts-example-tasktracker/lts-example-tasktracker-tester/src/main/java/com/github/ltsopensource/example/TestJobRunnerTester.java b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-tester/src/main/java/com/github/ltsopensource/example/TestJobRunnerTester.java new file mode 100644 index 000000000..ba0594806 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/lts-example-tasktracker-tester/src/main/java/com/github/ltsopensource/example/TestJobRunnerTester.java @@ -0,0 +1,44 @@ +package com.github.ltsopensource.example; + +import com.github.ltsopensource.core.domain.Job; +import com.github.ltsopensource.core.json.JSON; +import com.github.ltsopensource.tasktracker.Result; +import com.github.ltsopensource.tasktracker.runner.JobContext; +import com.github.ltsopensource.tasktracker.runner.JobExtInfo; +import com.github.ltsopensource.tasktracker.runner.JobRunner; +import com.github.ltsopensource.tasktracker.runner.JobRunnerTester; + +/** + * @author Robert HG (254963746@qq.com) on 9/13/15. + */ +public class TestJobRunnerTester extends JobRunnerTester { + + public static void main(String[] args) throws Throwable { + // Mock Job 数据 + Job job = new Job(); + job.setTaskId("2313213"); + + JobContext jobContext = new JobContext(); + jobContext.setJob(job); + + JobExtInfo jobExtInfo = new JobExtInfo(); + jobExtInfo.setRetry(false); + + jobContext.setJobExtInfo(jobExtInfo); + + // 运行测试 + TestJobRunnerTester tester = new TestJobRunnerTester(); + Result result = tester.run(jobContext); + System.out.println(JSON.toJSONString(result)); + } + + @Override + protected void initContext() { + // TODO 初始化Spring容器 + } + + @Override + protected JobRunner newJobRunner() { + return new TestJobRunner(); + } +} diff --git a/lts-examples/lts-example-tasktracker/pom.xml b/lts-examples/lts-example-tasktracker/pom.xml new file mode 100644 index 000000000..9b514f4b6 --- /dev/null +++ b/lts-examples/lts-example-tasktracker/pom.xml @@ -0,0 +1,54 @@ + + + + lts-examples + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + pom + + lts-example-tasktarcker-springboot + lts-example-tasktracker-java + lts-example-tasktracker-spring-xml + lts-example-tasktracker-spring-annotation-shard + lts-example-tasktracker-spring-xml-shard + lts-example-tasktracker-spring-annotation + lts-example-tasktracker-springboot-shard + lts-example-tasktracker-tester + + lts-example-tasktracker + + + + com.github.ltsopensource + lts + + + log4j + log4j + + + com.github.sgroschupf + zkclient + + + io.netty + netty-all + + + com.alibaba + fastjson + + + org.mapdb + mapdb + + + org.javassist + javassist + + + diff --git a/lts-examples/pom.xml b/lts-examples/pom.xml new file mode 100644 index 000000000..af8d98424 --- /dev/null +++ b/lts-examples/pom.xml @@ -0,0 +1,233 @@ + + + + lts-parent + com.github.ltsopensource + 1.7.1-SNAPSHOT + + 4.0.0 + pom + lts-examples + + + lts-example-springboot + + + + 2.7.3 + 1.2.7 + 1.8 + 2.9.1 + 0.1 + 3.4.5 + 3.0.2 + 1.0.0-rc1 + 4.11 + 4.0.20.Final + 1.7.5 + 1.2.16 + 1.6 + 1.0.14 + 5.1.26 + 5.0.73 + 3.10.1 + 1.4.189 + 4.2.5.RELEASE + 2.0.9 + 4.0.38 + 2.0-beta10 + 2.4.5 + 2.6.3 + 1.7.2 + 1.5.4 + 1.3.3.RELEASE + 1.7.0 + 2.2.2 + 3.20.0-GA + + + + + + com.github.ltsopensource + lts + ${lts.version} + + + log4j + log4j + ${log4j.version} + + + com.github.sgroschupf + zkclient + ${zkclient.version} + + + log4j + log4j + + + + + org.apache.curator + curator-recipes + ${curator.version} + + + redis.clients + jedis + ${jedis.version} + + + com.sleepycat + je + ${sleepycat.version} + + + org.rocksdb + rocksdbjni + ${rocksdbjni.version} + + + org.fusesource.leveldbjni + leveldbjni-all + ${leveldbjni.version} + + + org.springframework + spring-core + ${springframework.version} + + + org.springframework + spring-beans + ${springframework.version} + + + org.springframework + spring-context + ${springframework.version} + + + org.springframework + spring-context-support + ${springframework.version} + + + org.springframework + spring-tx + ${springframework.version} + + + org.apache.mina + mina-core + ${mina.version} + + + io.netty + netty-all + ${netty.version} + + + com.caucho + hessian + ${hessian.version} + + + org.mapdb + mapdb + ${mapdb.version} + + + com.alibaba + fastjson + ${fastjson.version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + org.mongodb.morphia + morphia + ${morphia.version} + + + org.mongodb + mongo-java-driver + ${mongo.driver.version} + + + mysql + mysql-connector-java + ${mysql.version} + + + com.alibaba + druid + ${druid.version} + + + org.quartz-scheduler + quartz + ${quartz.version} + + + org.springframework.boot + spring-boot + ${spring.boot.version} + + + org.springframework.boot + spring-boot-autoconfigure + ${spring.boot.version} + + + org.javassist + javassist + ${javassist.version} + + + + + + + + maven-compiler-plugin + + 1.6 + 1.6 + UTF-8 + + + + maven-source-plugin + 2.2.1 + + true + + + + compile + + jar + + + + + + + diff --git a/lts-startup/src/main/java/com/github/ltsopensource/startup/tasktracker/TaskTrackerJobRunner.java b/lts-startup/src/main/java/com/github/ltsopensource/startup/tasktracker/TaskTrackerJobRunner.java new file mode 100644 index 000000000..a67fbbc5b --- /dev/null +++ b/lts-startup/src/main/java/com/github/ltsopensource/startup/tasktracker/TaskTrackerJobRunner.java @@ -0,0 +1,35 @@ +package com.github.ltsopensource.startup.tasktracker; + +import com.github.ltsopensource.core.domain.Action; +import com.github.ltsopensource.core.logger.Logger; +import com.github.ltsopensource.core.logger.LoggerFactory; +import com.github.ltsopensource.tasktracker.Result; +import com.github.ltsopensource.tasktracker.logger.BizLogger; +import com.github.ltsopensource.tasktracker.runner.JobContext; +import com.github.ltsopensource.tasktracker.runner.JobRunner; + +/** + * @author Robert HG (254963746@qq.com) on 4/17/16. + */ +public class TaskTrackerJobRunner implements JobRunner { + + private static final Logger LOGGER = LoggerFactory.getLogger(TaskTrackerJobRunner.class); + + @Override + public Result run(JobContext jobContext) throws Throwable { + try { +// BizLogger bizLogger = LtsLoggerFactory.getBizLogger(); + BizLogger bizLogger = jobContext.getBizLogger(); + + // TODO 业务逻辑 + LOGGER.info("我要执行:" + jobContext); + // 会发送到 LTS (JobTracker上) + bizLogger.info("测试,业务日志啊啊啊啊啊"); + + } catch (Exception e) { + LOGGER.info("Run job failed!", e); + return new Result(Action.EXECUTE_FAILED, e.getMessage()); + } + return new Result(Action.EXECUTE_SUCCESS, "执行成功了,哈哈"); + } +} diff --git a/lts-startup/src/main/resources/conf/log4j.properties b/lts-startup/src/main/resources/conf/log4j.properties index 4e3c103a1..f9e255c30 100644 --- a/lts-startup/src/main/resources/conf/log4j.properties +++ b/lts-startup/src/main/resources/conf/log4j.properties @@ -1,7 +1,13 @@ +log4j.rootLogger=INFO,CONSOLE,LOGFILE -log4j.rootLogger=INFO,stdout +log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender +log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout +log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}|%-5p| [%c{1}-->%M] --- %m%n -log4j.appender.stdout.Threshold=INFO -log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=[%-5p] [%d{HH:mm:ss}] %c - %m%n \ No newline at end of file +log4j.appender.LOGFILE=org.apache.log4j.DailyRollingFileAppender +log4j.appender.LOGFILE.File=../logs/its.log +log4j.appender.logfile.encoding=UTF-8 +log4j.appender.LOGFILE.Append=false +log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout +log4j.appender.LOGFILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %l --- %m%n +log4j.appender.LOGFILE.File.DatePattern='.'yyyy-MM-dd'.log' \ No newline at end of file diff --git a/lts-startup/src/main/resources/conf/lts-admin.cfg b/lts-startup/src/main/resources/conf/lts-admin.cfg index 940ae355a..ad1197d05 100644 --- a/lts-startup/src/main/resources/conf/lts-admin.cfg +++ b/lts-startup/src/main/resources/conf/lts-admin.cfg @@ -7,7 +7,7 @@ registryAddress=zookeeper://127.0.0.1:2181 # registryAddress=redis://127.0.0.1:6379 # 集群名称 -clusterName=test_cluster +clusterName=css-vsim-web # zk客户端,可选值 zkclient, curator configs.zk.client=zkclient diff --git a/lts-startup/src/main/resources/conf/lts-monitor.cfg b/lts-startup/src/main/resources/conf/lts-monitor.cfg index fd7740009..d1f5d49f6 100644 --- a/lts-startup/src/main/resources/conf/lts-monitor.cfg +++ b/lts-startup/src/main/resources/conf/lts-monitor.cfg @@ -4,7 +4,7 @@ registryAddress=zookeeper://127.0.0.1:2181 # registryAddress=redis://127.0.0.1:6379 # 集群名称 -clusterName=test_cluster +clusterName=css-vsim-web # LTS业务日志, 可选值 mysql, mongo configs.job.logger=mysql diff --git a/lts-startup/src/main/resources/conf/tasktracker.cfg b/lts-startup/src/main/resources/conf/tasktracker.cfg index 83e12295b..2e388daa1 100644 --- a/lts-startup/src/main/resources/conf/tasktracker.cfg +++ b/lts-startup/src/main/resources/conf/tasktracker.cfg @@ -3,13 +3,13 @@ registryAddress=zookeeper://127.0.0.1:2181 # 集群名称 -clusterName=test_cluster +clusterName=css-vsim-web # 节点组名称 -nodeGroup=test_trade_taskTracker +nodeGroup=css-task-tracker # JobRunner 任务执行类 -jobRunnerClass=com.github.ltsopensource.startup.tasktracker.test.TestJobRunner +jobRunnerClass=com.github.ltsopensource.startup.tasktracker.TaskTrackerJobRunner # 运行线程数 workThreads=10 diff --git a/lts/pom.xml b/lts/pom.xml index faf67bdd6..ef9338f54 100644 --- a/lts/pom.xml +++ b/lts/pom.xml @@ -2,16 +2,15 @@ + 4.0.0 lts-parent com.github.ltsopensource 1.7.1-SNAPSHOT jar - 4.0.0 lts ${project.artifactId} - com.github.ltsopensource @@ -41,167 +40,135 @@ org.mongodb.morphia morphia - provided org.mongodb mongo-java-driver - provided com.alibaba fastjson - provided org.slf4j slf4j-api - provided org.slf4j slf4j-log4j12 - provided log4j log4j - provided commons-logging commons-logging-api - provided io.netty netty-all - provided com.github.sgroschupf zkclient - provided org.apache.curator curator-recipes - provided redis.clients jedis - provided org.fusesource.leveldbjni leveldbjni-all - provided com.alibaba druid - provided com.sleepycat je - provided org.rocksdb rocksdbjni - provided com.h2database h2 - provided org.apache.mina mina-core - provided com.caucho hessian - provided org.mapdb mapdb - provided org.codehaus.groovy groovy - provided com.fasterxml.jackson.core jackson-core - provided com.fasterxml.jackson.core jackson-databind - provided com.sun.mail javax.mail - provided mysql mysql-connector-java - provided org.javassist javassist - provided org.springframework spring-core ${springframework.version} - provided org.springframework spring-beans ${springframework.version} - provided org.springframework spring-context ${springframework.version} - provided org.quartz-scheduler quartz ${quartz.version} - provided org.springframework.boot spring-boot - provided org.springframework.boot spring-boot-autoconfigure - provided org.springframework.boot spring-boot-configuration-processor ${spring.boot.version} - provided true diff --git a/pom.xml b/pom.xml index 8c424ae37..557015ec0 100644 --- a/pom.xml +++ b/pom.xml @@ -3,13 +3,11 @@ xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.sonatype.oss oss-parent 7 - com.github.ltsopensource lts-parent pom @@ -24,26 +22,27 @@ lts-spring lts-startup lts-monitor + lts-examples lts 2.7.3 - 1.2.7 + 1.2.41 1.8 2.9.1 0.1 3.4.5 - 3.0.2 - 1.0.0-rc1 + 3.5.0 + 1.3.2 4.11 4.0.20.Final 1.1 - 1.7.5 - 1.2.16 + 1.7.25 + 1.2.17 1.6 - 1.0.14 - 5.1.26 + 1.1.5 + 5.1.43 5.0.73 3.10.1 1.4.189