maven 配置只上quartz和kettle的配置部分
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
<!-- kettle -->
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-core</artifactId>
<version>7.1.0.0-12</version>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-dbdialog</artifactId>
<version>7.1.0.0-12</version>
</dependency>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-engine</artifactId>
<version>7.1.0.0-12</version>
</dependency>
<dependency>
<groupId>pentaho</groupId>
<artifactId>metastore</artifactId>
<version>7.1.0.0-12</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-vfs2</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
<repositories>
<repository>
<id>pentaho-releases</id>
<name>Kettle</name>
<url>https://nexus.pentaho.org/content/groups/omni/</url>
</repository>
<!-- 阿里云maven仓库 -->
<repository>
<id>public</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
job类代码:
package com.doart.job;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.doart.utils.KettleUtils;
/**
* testSecondsStore job.
*/
public class TestSecondsStoreJob implements Job {
/**
* 日志.
*/
private Logger log = LoggerFactory.getLogger(TestSecondsStoreJob.class);
@Override
public void execute(JobExecutionContext context) {
JobDetail jobDetail = context.getJobDetail();
String jobName = jobDetail.getKey().getName();
// String name = jobDetail.getJobDataMap().getString("name");
log.info(jobName + "执行开始!");
String kjbPath = "E:\\kettle\\project\\testSecondsStore.kjb";//job的路径
try {
KettleUtils.runJob(kjbPath);
} catch (Exception e) {
String msg = "runJob错误:" + e.getMessage();
log.error(msg, e);
}
}
}
前端代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="js/layui/css/layui.css" />
</head>
<body>
<div class="layui-form" style="margin:10px 0px 10px 10px">
<div class="layui-inline">
<label class="layui-form-lable">任务</label>
<div class="layui-inline" style="margin:0px 0px 0px 10px">
<a class="layui-btn" id="start">开始</a>
</div>
<div class="layui-inline" style="margin:0px 0px 0px 10px">
<a class="layui-btn layui-btn-warm" id="pause">暂停</a>
</div>
<div class="layui-inline" style="margin:0px 0px 0px 10px">
<a class="layui-btn layui-btn-warm" id="resume">恢复</a>
</div>
<div class="layui-inline" style="margin:0px 0px 0px 10px">
<a class="layui-btn layui-btn-danger" id="stop">停止</a>
</div>
<div class="layui-inline" style="margin:0px 0px 0px 10px">
<label class="layui-form-lable">job1执行间隔</label>
</div>
<div class="layui-inline" style="margin:0px 0px 0px 10px">
<input class="layui-input" type="text" id="cronExpression1" placeholder="请输入频率时间" autocomplete="off">
</div>
<div class="layui-inline" style="margin:0px 0px 0px 10px">
<label class="layui-form-lable">job2执行间隔</label>
</div>
<div class="layui-inline" style="margin:0px 0px 0px 10px">
<input class="layui-input" type="text" id="cronExpression2" placeholder="请输入频率时间" autocomplete="off">
</div>
<div class="layui-inline" style="margin:0px 0px 0px 10px">
<a class="layui-btn layui-btn-danger" id="updateQuartz">修改执行间隔</a>
</div>
</div>
</div>
<table id="dataTbl2" lay-filter="tblFilter1" class="layui-table"></table>
<table id="dataTbl1" lay-filter="tblFilter2" class="layui-table"></table>
<script type="text/javascript" src="js/layui/layui.all.js"></script>
<script type="text/html" id="opera">
<input type="button" name="update" lay-event="edit" value="编辑" class="layui-btn layui-btn-sm" >
<input type="button" name="delete" lay-event="delete" value="删除" class="layui-btn layui-btn-danger layui-btn-sm" >
</script>
<script>
layui.use(["form", "table", "element", "layer"], function () {
var form = layui.form;
var table = layui.table;
var element = layui.element;
var layer = layui.layer;
var $ = layui.jquery;
var timer;
// test_client_1数据
table.render({
elem : "#dataTbl1",
id : "dataTbl1",
skin: "row",
even: true,
url : "/demo/kettle/getTestClinet1PageBean.do",
page : true,
limits: [3, 5, 10],
limit: 5,
cols : [ [ {type: "numbers", title:"序号", width:50},
{field : "id", title:"Id", sort:true, align:"center"},
{field : "userId", title : "用户id", align:"center"},
{field : "userName", title : "用户名", align:"center"},
{title : "操作", width:150, align:"center", toolbar:"#opera"},
] ],
request: {
page : "curr",
limit : "size"
},
parseData : function(res) {
if (res.code == 200) {
return {
"code": 0,
"msg": res.msg,
"count": res.data.count,
"data": res.data.data
}
}
}
});
// test_日期表数据
table.render({
elem : "#dataTbl2",
id : "dataTbl2",
skin: "row",
even: true,
url : "/demo/kettle/getTestTodayPageBean.do",
page : true,
limits: [3, 5, 10],
limit: 5,
cols : [ [ {type: "numbers", title:"序号", width:50},
{field : "id", title:"Id", sort:true, align:"center"},
{field : "userId", title : "用户id", align:"center"},
{field : "userName", title : "用户名", align:"center"},
{title : "操作", width:150, align:"center", toolbar:"#opera"},
] ],
request: {
page : "curr",
limit : "size"
},
parseData : function(res) {
if (res.code == 200) {
return {
"code": 0,
"msg": res.msg,
"count": res.data.count,
"data": res.data.data
}
}
}
});
$("#start").click(function () {
$.ajax({
type : "post",
url : "/demo/kettle/startJob.do",
success : function (data) {
var data = JSON.parse(data);
if (data["code"] == "200") {
layer.msg(data.msg, {icon : 1}, 3000);
} else {
layer.msg(data.msg, {icon : 2}, 3000);
}
}
});
timer = setInterval(function () {
table.reload('dataTbl1', {
page : {curr:1},
url : "/demo/kettle/getTestClinet1PageBean.do",
method : "post"
});
table.reload('dataTbl2', {
page : {curr:1},
url : "/demo/kettle/getTestTodayPageBean.do",
method : "post"
});
}, 10000);
});
$("#stop").click(function () {
$.ajax({
type : "post",
url : "/demo/kettle/stopJob.do",
success : function (data) {
var data = JSON.parse(data);
if (data.code == 200) {
layer.msg(data.msg, {icon : 1}, 3000);
} else {
layer.msg(data.msg, {icon : 2}, 3000);
}
}
});
clearInterval(timer);
});
$("#pause").click(function () {
$.ajax({
type : "post",
url : "/demo/kettle/pauseJob.do",
success : function (data) {
var data = JSON.parse(data);
if (data.code == 200) {
layer.msg(data.msg, {icon : 1}, 3000);
} else {
layer.msg(data.msg, {icon : 2}, 3000);
}
}
});
});
$("#resume").click(function () {
$.ajax({
type : "post",
url : "/demo/kettle/resumeJob.do",
success : function (data) {
var data = JSON.parse(data);
if (data.code == 200) {
layer.msg(data.msg, {icon : 1}, 3000);
} else {
layer.msg(data.msg, {icon : 2}, 3000);
}
}
});
});
$("#updateQuartz").click(function () {
var cronExpression1 = $("#cronExpression1").val();
var cronExpression2 = $("#cronExpression2").val();
$.ajax({
type : "post",
url : "/demo/kettle/updateTriggerInterval.do",
data : {
"cronExpression1" : cronExpression1,
"cronExpression2" : cronExpression2},
success : function (data) {
var data = JSON.parse(data);
if (data.code == 200) {
layer.msg(data.msg, {icon : 1}, 3000);
} else {
layer.msg(data.msg, {icon : 2}, 3000);
}
}
});
});
});
</script>
</body>
</html>
controller代码:
package com.doart.controller;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.doart.bean.TestClient1Bean;
import com.doart.bean.TestTodayBean;
import com.doart.service.IKettleService;
/**
* kettle控制器.
*/
@Controller
@RequestMapping("/kettle")
public class KettleController extends BaseController {
/**
* 日志.
*/
private static Logger log = LoggerFactory.getLogger(KettleController.class);
/**
* kettle Service.
*/
@Autowired
private IKettleService kettleService;
/**
* seconds job名字.
*/
private String jobName1 = "testSecondsStore";
/**
* seconds job 组名.
*/
private String groupName1 = "group1";
/**
* seconds job 触发器名.
*/
private String triggerName1 = "trigger1";
/**
* seconds job cron表达式.
*/
private String cronExpression1 = "*/20 * * * * ?";
/**
* day job 名字.
*/
private String jobName2 = "testDayStore";
/**
* day job 组名.
*/
private String groupName2 = "group2";
/**
* day job 触发器名.
*/
private String triggerName2 = "trigger2";
/**
* day job cron表达式.
*/
private String cronExpression2 = "0 0 3 * * ? ";
/**
* job 参数名.
*/
private String jobPara = "name";
/**
* job 参数值.
*/
private String jobValue = "doart123";
/**
* 分页查询testClinet1数据.
* @param form form
* @param response 响应
*/
@RequestMapping("/getTestClinet1PageBean")
@ResponseBody
public void getTestClinet1PageBean(HttpServletResponse response, TestClient1Bean form) {
try {
Map<String, Object> map = new HashMap<String, Object>();
form.setPage((form.getPage() - 1) * form.getLimit());
List<TestClient1Bean> list = kettleService.getTestClinet1PageBean(form);
int count = kettleService.getTestClient1Count();
map.put("code", "0");
map.put("msg", "查询成功");
map.put("count", count);
map.put("data", list);
respSuccessMsg(response, map, "查询成功");
} catch (Exception e) {
String msg = "查询失败" + e.getMessage();
log.error(msg, e);
respErrorMsg(response, msg);
}
}
/**
* 分页查询test_today数据.
* @param form form
* @param response 响应
*/
@RequestMapping("/getTestTodayPageBean")
private void getTestTodayPageBean(HttpServletResponse response, TestTodayBean form) {
try {
Map<String, Object> map = new HashMap<String, Object>();
form.setPage((form.getPage() - 1) * form.getLimit());
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
String date = format.format(new Date());
form.setTableName("test_" + date);
List<TestClient1Bean> list = kettleService.getTestTodayPageBean(form);
int count = kettleService.getTestTodayCount(form);
map.put("code", "0");
map.put("msg", "查询成功");
map.put("count", count);
map.put("data", list);
respSuccessMsg(response, map, "查询成功");
} catch (Exception e) {
String msg = "查询失败" + e.getMessage();
log.error(msg, e);
respErrorMsg(response, msg);
}
}
/**
* 执行job.
* @param response 响应
*/
@RequestMapping("/startJob")
public void startJob(HttpServletResponse response) {
try {
kettleService.runSecondsJob(jobName1, groupName1, triggerName1, cronExpression1, jobPara, jobValue);
kettleService.runDayJob(jobName2, groupName2, triggerName2, cronExpression2, jobPara, jobValue);
respSuccessMsg(response, "", "job执行成功");
} catch (Exception e) {
String msg = "job执行出现错误:" + e.getMessage();
log.error(msg, e);
respErrorMsg(response, msg);
}
}
/**
* 暂停job.
* @param response 响应
*/
@RequestMapping("/pauseJob")
public void pauseJob(HttpServletResponse response) {
try {
kettleService.pauseSecondsTrigger(groupName1, triggerName1);
kettleService.pauseDayTrigger(groupName2, triggerName2);
respSuccessMsg(response, "", "job暂停成功");
} catch (Exception e) {
String msg = "job暂停出现错误:" + e.getMessage();
log.error(msg, e);
respErrorMsg(response, msg);
}
}
/**
* 恢复job.
* @param response 响应
*/
@RequestMapping("/resumeJob")
public void resumeJob(HttpServletResponse response) {
try {
kettleService.resumeSecondsTrigger(groupName1, triggerName1);
kettleService.resumeDayTrigger(groupName2, triggerName2);
respSuccessMsg(response, "", "job恢复成功");
} catch (Exception e) {
String msg = "job恢复出现错误:" + e.getMessage();
log.error(msg, e);
respErrorMsg(response, msg);
}
}
/**
* 停止seconds job.
* @param response 响应
*/
@RequestMapping("/stopJob")
public void stopJob(HttpServletResponse response) {
try {
kettleService.removeSecondsTrigger(groupName1, triggerName1);
kettleService.removeDayTrigger(groupName2, triggerName2);
respSuccessMsg(response, "", "job停止成功");
} catch (Exception e) {
String msg = "job停止出现错误:" + e.getMessage();
log.error(msg, e);
respErrorMsg(response, msg);
}
}
/**
* 修改 trigger 执行间隔.
* @param response 响应
* @param request 请求
*/
@RequestMapping("/updateTriggerInterval")
public void updateTriggerInterval(HttpServletResponse response, HttpServletRequest request) {
String cronExpression1 = request.getParameter("cronExpression1");
String cronExpression2 = request.getParameter("cronExpression2");
try {
if (cronExpression1 != null && cronExpression1 != "") {
kettleService.updateSecondsTriggerInterval(cronExpression1, groupName1, jobName1, triggerName1);
}
if (cronExpression2 != null && cronExpression2 != "") {
kettleService.updateDayTriggerInterval(cronExpression2, groupName2, jobName2, triggerName2);
}
respSuccessMsg(response, "", "修改执行间隔成功");
} catch (Exception e) {
String msg = "修改执行间隔出现错误" + e.getMessage();
log.error(msg, e);
respErrorMsg(response, msg);
}
}
}
service 接口代码 不给了 直接实现类:
package com.doart.service.impl;
import java.util.List;
import java.util.Properties;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.doart.bean.TestClient1Bean;
import com.doart.bean.TestTodayBean;
import com.doart.dao.KettleDao;
import com.doart.job.TestDayStoreJob;
import com.doart.job.TestSecondsStoreJob;
import com.doart.service.IKettleService;
/**
* kettle 实现类.
*/
@Service
public class KettleServiceImpl implements IKettleService {
/**
* testSecondsStore job 调度器.
*/
private Scheduler secondsScheduler;
/**
* testDayStore job 调度器.
*/
private Scheduler dayScheduler;
/**
* 构造器.
* @throws Exception 异常
*/
public KettleServiceImpl() throws Exception {
StdSchedulerFactory sf1 = new StdSchedulerFactory();
Properties props1 = new Properties();
props1.put("org.quartz.scheduler.instanceName", "Seconds");
props1.put("org.quartz.threadPool.threadCount", "10");
sf1.initialize(props1);
secondsScheduler = sf1.getScheduler();
StdSchedulerFactory sf2 = new StdSchedulerFactory();
Properties props2 = new Properties();
props2.put("org.quartz.scheduler.instanceName", "Seconds");
props2.put("org.quartz.threadPool.threadCount", "10");
sf2.initialize(props2);
dayScheduler = sf2.getScheduler();
}
/**
* kettle DAO.
*/
@Autowired
private KettleDao kettleDao;
@Override
public List<TestClient1Bean> getTestClinet1PageBean(TestClient1Bean form) {
return kettleDao.getTestClinet1PageBean(form);
}
@Override
public int getTestClient1Count() {
return kettleDao.getTestClient1Count();
}
@Override
public List<TestClient1Bean> getTestTodayPageBean(TestTodayBean form) {
return kettleDao.getTestTodayPageBean(form);
}
@Override
public int getTestTodayCount(TestTodayBean form) {
return kettleDao.getTestTodayCount(form);
}
@Override
public void runSecondsJob(String jobName, String groupName, String triggerName, String cronExpression,
String jobPara, String jobValue) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(TestSecondsStoreJob.class)
.withIdentity(jobName, groupName).usingJobData(jobPara, jobValue).build();
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, groupName).startNow()
.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).build();
secondsScheduler.scheduleJob(jobDetail, trigger);
secondsScheduler.start();
}
@Override
public void runDayJob(String jobName, String groupName, String triggerName, String cronExpression,
String jobPara, String jobValue) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(TestDayStoreJob.class)
.withIdentity(jobName, groupName).usingJobData(jobPara, jobValue).build();
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, groupName).startNow()
.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).build();
dayScheduler.scheduleJob(jobDetail, trigger);
dayScheduler.start();
}
@Override
public void pauseSecondsTrigger(String groupName, String triggerName) throws Exception {
secondsScheduler.pauseTrigger(new TriggerKey(triggerName, groupName));
}
@Override
public void pauseDayTrigger(String groupName, String triggerName) throws Exception {
dayScheduler.pauseTrigger(new TriggerKey(triggerName, groupName));
}
@Override
public void resumeSecondsTrigger(String groupName, String triggerName) throws Exception {
secondsScheduler.resumeTrigger(new TriggerKey(triggerName, groupName));
}
@Override
public void resumeDayTrigger(String groupName, String triggerName) throws Exception {
dayScheduler.resumeTrigger(new TriggerKey(triggerName, groupName));
}
@Override
public void removeSecondsTrigger(String groupName, String triggerName) throws Exception {
// 先暂停在移除
secondsScheduler.pauseTrigger(new TriggerKey(triggerName, groupName));
secondsScheduler.unscheduleJob(new TriggerKey(triggerName, groupName));
}
@Override
public void removeDayTrigger(String groupName, String triggerName) throws Exception {
// 先暂停在移除
dayScheduler.pauseTrigger(new TriggerKey(triggerName, groupName));
dayScheduler.unscheduleJob(new TriggerKey(triggerName, groupName));
}
@Override
public void updateSecondsTriggerInterval(String cronExpression, String groupName, String jobName,
String triggerName) throws Exception {
Trigger trigger = secondsScheduler.getTrigger(new TriggerKey(triggerName, groupName));
if (trigger != null) {
removeSecondsTrigger(groupName, triggerName);
runSecondsJob(jobName, groupName, triggerName, cronExpression, "name", "doart1");
}
}
@Override
public void updateDayTriggerInterval(String cronExpression, String groupName, String jobName,
String triggerName) throws Exception {
Trigger trigger = dayScheduler.getTrigger(new TriggerKey(triggerName, groupName));
if (trigger != null) {
removeDayTrigger(groupName, triggerName);
runDayJob(jobName, groupName, triggerName, cronExpression, "name", "doart2");
}
}
}
dao代码:
package com.doart.dao;
import java.util.List;
import com.doart.bean.TestClient1Bean;
import com.doart.bean.TestTodayBean;
/**
* kettle DAO.
*/
public interface KettleDao {
/**
* 获取testClient1数据.
* @param form form
* @return testClient1数据集合
*/
List<TestClient1Bean> getTestClinet1PageBean(TestClient1Bean form);
/**
* 获取testClint1数量.
* @return 数量
*/
int getTestClient1Count();
/**
* 获取testToday数据.
* @param form form
* @return testToday数据集合
*/
List<TestClient1Bean> getTestTodayPageBean(TestTodayBean form);
/**
* 获取testToday数量.
* @param form form
* @return testToday数量
*/
int getTestTodayCount(TestTodayBean form);
}
mapper映射文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.doart.dao.KettleDao">
<select id="getTestClinet1PageBean" resultType="com.doart.bean.TestClient1Bean" parameterType="com.doart.bean.TestClient1Bean">
select id, user_id, user_name from test_client_1
<if test = "page !=null and limit != null">
limit #{page}, #{limit}
</if>
</select>
<select id="getTestClient1Count" resultType="int" parameterType="com.doart.bean.TestClient1Bean">
select count(*) from test_client_1
</select>
<select id="getTestTodayPageBean" resultType="com.doart.bean.TestClient1Bean" parameterType="com.doart.bean.TestTodayBean">
select id, user_id, user_name from ${tableName}
<if test = "page !=null and limit != null">
limit #{page}, #{limit}
</if>
</select>
<select id="getTestTodayCount" resultType="int" parameterType="com.doart.bean.TestTodayBean">
select count(*) from ${tableName}
</select>
</mapper>