目錄
一、模擬登錄方式
二、注解方式
三、訪問者調用
四、測試
本次自定義方式分為兩種:一種是模擬登錄,另一種是使用注解的方式
一、模擬登錄方式
修改xxl-job-admin工程,在controller里面添加一個MyApiController,在里面添加自定義的增刪等方法
@RestController
@RequestMapping("/api/myjobinfo")
public class MyApiController {private static Logger logger = LoggerFactory.getLogger(MyDynamicApiController.class);@Autowiredprivate XxlJobService xxlJobService;@Autowiredprivate LoginService loginService;@RequestMapping(value = "/pageList",method = RequestMethod.POST)public Map<String, Object> pageList(@RequestBody XxlJobQuery xxlJobQuery) {return xxlJobService.pageList(xxlJobQuery.getStart(),xxlJobQuery.getLength(),xxlJobQuery.getJobGroup(),xxlJobQuery.getTriggerStatus(),xxlJobQuery.getJobDesc(),xxlJobQuery.getExecutorHandler(),xxlJobQuery.getAuthor());}@PostMapping("/save")public ReturnT<String> add(@RequestBody(required = true)XxlJobInfo jobInfo) {long nextTriggerTime = 0;try {Date nextValidTime = new CronExpression(jobInfo.getJobCron()).getNextValidTimeAfter(new Date(System.currentTimeMillis() + JobScheduleHelper.PRE_READ_MS));if (nextValidTime == null) {return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("jobinfo_field_cron_never_fire"));}nextTriggerTime = nextValidTime.getTime();} catch (ParseException e) {logger.error(e.getMessage(), e);return new ReturnT<String>(ReturnT.FAIL_CODE, I18nUtil.getString("jobinfo_field_cron_unvalid")+" | "+ e.getMessage());}jobInfo.setTriggerStatus(1);jobInfo.setTriggerLastTime(0);jobInfo.setTriggerNextTime(nextTriggerTime);jobInfo.setUpdateTime(new Date());if(jobInfo.getId()==0){return xxlJobService.add(jobInfo);}else{return xxlJobService.update(jobInfo);}}@RequestMapping(value = "/delete",method = RequestMethod.GET)public ReturnT<String> delete(int id) {return xxlJobService.remove(id);}@RequestMapping(value = "/start",method = RequestMethod.GET)public ReturnT<String> start(int id) {return xxlJobService.start(id);}@RequestMapping(value = "/stop",method = RequestMethod.GET)public ReturnT<String> stop(int id) {return xxlJobService.stop(id);}@RequestMapping(value="login", method=RequestMethod.GET)@PermissionLimit(limit=false)public ReturnT<String> loginDo(HttpServletRequest request, HttpServletResponse response, String userName, String password, String ifRemember){boolean ifRem = (ifRemember!=null && ifRemember.trim().length()>0 && "on".equals(ifRemember))?true:false;ReturnT<String> result= loginService.login(request, response, userName, password, ifRem);return result;}
}
此方式優點:除了登錄接口為,其他接口都需要校驗,缺點:調用接口前需要登錄,比較繁瑣
二、注解方式
在項目中,有一個JobInfoController類,,這個類就是處理各種新增任務,修改任務,觸發任務;但這些接口都是后臺管理頁面使用的,要想調用就必須要先登錄,也就是方式一,然而xxl-job已經為我們提供了一個注解,通過這個注解的配置可以跳過登錄進行訪問,這個注解就是 @PermissionLimit(limit = false) ,將limit設置為false即可,默認是true,也就是需要做登錄驗證。我們可以在自己定義的Controller上使用這個注解。
@RestController
@RequestMapping("/api/myjobinfo")
public class MyApiController {@RequestMapping("/add")@ResponseBody@PermissionLimit(limit = false)public ReturnT<String> addJobInfo(@RequestBody XxlJobInfo jobInfo) {return xxlJobService.add(jobInfo);}@RequestMapping("/update")@ResponseBody@PermissionLimit(limit = false)public ReturnT<String> updateJobCron(@RequestBody XxlJobInfo jobInfo) {return xxlJobService.updateCron(jobInfo);}@RequestMapping("/remove")@ResponseBody@PermissionLimit(limit = false)public ReturnT<String> removeJob(@RequestBody XxlJobInfo jobInfo) {return xxlJobService.remove(jobInfo.getId());}@RequestMapping("/pauseJob")@ResponseBody@PermissionLimit(limit = false)public ReturnT<String> pauseJob(@RequestBody XxlJobInfo jobInfo) {return xxlJobService.stop(jobInfo.getId());}@RequestMapping("/start")@ResponseBody@PermissionLimit(limit = false)public ReturnT<String> startJob(@RequestBody XxlJobInfo jobInfo) {return xxlJobService.start(jobInfo.getId());}@RequestMapping("/stop")@ResponseBodypublic ReturnT<String> pause(int id) {return xxlJobService.stop(id);}@RequestMapping("/addAndStart")@ResponseBody@PermissionLimit(limit = false)public ReturnT<String> addAndStart(@RequestBody XxlJobInfo jobInfo) {ReturnT<String> result = xxlJobService.add(jobInfo);int id = Integer.valueOf(result.getContent());xxlJobService.start(id);return result;}}
該方式的優點:無需登錄可以直接調用接口,缺點:接口全部暴露有一定的風險。
將admin項目編譯打包后放入服務器,客戶端就可以開始調用了....
三、訪問者調用
1、創建實體
@Data
public class XxlJobInfo {private int id; // 主鍵IDprivate int jobGroup; // 執行器主鍵IDprivate String jobDesc; // 備注private String jobCron;private Date addTime;private Date updateTime;private String author; // 負責人private String alarmEmail; // 報警郵件private String scheduleType; // 調度類型private String scheduleConf; // 調度配置,值含義取決于調度類型private String misfireStrategy; // 調度過期策略private String executorRouteStrategy; // 執行器路由策略private String executorHandler; // 執行器,任務Handler名稱private String executorParam; // 執行器,任務參數private String executorBlockStrategy; // 阻塞處理策略private int executorTimeout; // 任務執行超時時間,單位秒private int executorFailRetryCount; // 失敗重試次數private String glueType; // GLUE類型 #com.xxl.job.core.glue.GlueTypeEnumprivate String glueSource; // GLUE源代碼private String glueRemark; // GLUE備注private Date glueUpdatetime; // GLUE更新時間private String childJobId; // 子任務ID,多個逗號分隔private int triggerStatus; // 調度狀態:0-停止,1-運行private long triggerLastTime; // 上次調度時間private long triggerNextTime; // 下次調度時間
}
2、創建一個工具類
也可以不創建直接調用
public class XxlJobUtil {private static String cookie="";/*** 查詢現有的任務* @param url* @param requestInfo* @return* @throws HttpException* @throws IOException*/public static JSONObject pageList(String url,JSONObject requestInfo) throws HttpException, IOException {String path = "/api/jobinfo/pageList";String targetUrl = url + path;HttpClient httpClient = new HttpClient();PostMethod post = new PostMethod(targetUrl);post.setRequestHeader("cookie", cookie);RequestEntity requestEntity = new StringRequestEntity(requestInfo.toString(), "application/json", "utf-8");post.setRequestEntity(requestEntity);httpClient.executeMethod(post);JSONObject result = new JSONObject();result = getJsonObject(post, result);System.out.println(result.toJSONString());return result;}/*** 新增/編輯任務* @param url* @param requestInfo* @return* @throws HttpException* @throws IOException*/public static JSONObject addJob(String url,JSONObject requestInfo) throws HttpException, IOException {String path = "/api/jobinfo/save";String targetUrl = url + path;HttpClient httpClient = new HttpClient();PostMethod post = new PostMethod(targetUrl);post.setRequestHeader("cookie", cookie);RequestEntity requestEntity = new StringRequestEntity(requestInfo.toString(), "application/json", "utf-8");post.setRequestEntity(requestEntity);httpClient.executeMethod(post);JSONObject result = new JSONObject();result = getJsonObject(post, result);System.out.println(result.toJSONString());return result;}/*** 刪除任務* @param url* @param id* @return* @throws HttpException* @throws IOException*/public static JSONObject deleteJob(String url,int id) throws HttpException, IOException {String path = "/api/jobinfo/delete?id="+id;return doGet(url,path);}/*** 開始任務* @param url* @param id* @return* @throws HttpException* @throws IOException*/public static JSONObject startJob(String url,int id) throws HttpException, IOException {String path = "/api/jobinfo/start?id="+id;return doGet(url,path);}/*** 停止任務* @param url* @param id* @return* @throws HttpException* @throws IOException*/public static JSONObject stopJob(String url,int id) throws HttpException, IOException {String path = "/api/jobinfo/stop?id="+id;return doGet(url,path);}public static JSONObject doGet(String url,String path) throws HttpException, IOException {String targetUrl = url + path;HttpClient httpClient = new HttpClient();HttpMethod get = new GetMethod(targetUrl);get.setRequestHeader("cookie", cookie);httpClient.executeMethod(get);JSONObject result = new JSONObject();result = getJsonObject(get, result);return result;}private static JSONObject getJsonObject(HttpMethod postMethod, JSONObject result) throws IOException {if (postMethod.getStatusCode() == HttpStatus.SC_OK) {InputStream inputStream = postMethod.getResponseBodyAsStream();BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));StringBuffer stringBuffer = new StringBuffer();String str;while((str = br.readLine()) != null){stringBuffer.append(str);}String response = new String(stringBuffer);br.close();return (JSONObject) JSONObject.parse(response);} else {return null;}}/*** 登錄* @param url* @param userName* @param password* @return* @throws HttpException* @throws IOException*/public static String login(String url, String userName, String password) throws HttpException, IOException {String path = "/api/jobinfo/login?userName="+userName+"&password="+password;String targetUrl = url + path;HttpClient httpClient = new HttpClient();HttpMethod get = new GetMethod((targetUrl));httpClient.executeMethod(get);if (get.getStatusCode() == 200) {Cookie[] cookies = httpClient.getState().getCookies();StringBuffer tmpcookies = new StringBuffer();for (Cookie c : cookies) {tmpcookies.append(c.toString() + ";");}cookie = tmpcookies.toString();} else {try {cookie = "";} catch (Exception e) {cookie="";}}return cookie;}
}
如果是方式二可以直接調用,無需登錄
四、測試
如果是方式二,無需登錄,也就不用再請求頭里面設置cookie
@RestController
public class TestController {@Value("${xxl.job.admin.addresses:''}")private String adminAddresses;@Value("${xxl.job.admin.login-username:admin}")private String loginUsername;@Value("${xxl.job.admin.login-pwd:123456}")private String loginPwd;//登陸private void xxljob_login(){try {XxlJobUtil.login(adminAddresses,loginUsername,loginPwd);} catch (IOException e) {throw new RuntimeException(e);}}@RequestMapping(value = "/pageList",method = RequestMethod.GET)public Object pageList() throws IOException {// int jobGroup, int triggerStatus, String jobDesc, String executorHandler, String authorJSONObject test=new JSONObject();test.put("length",10);xxljob_login();JSONObject response = XxlJobUtil.pageList(adminAddresses, test);return response.get("data");}@RequestMapping(value = "/add",method = RequestMethod.GET)public Object add() throws IOException {XxlJobInfo xxlJobInfo=new XxlJobInfo();xxlJobInfo.setJobCron("0/1 * * * * ?");xxlJobInfo.setJobGroup(3);xxlJobInfo.setJobDesc("Test XXl-job");xxlJobInfo.setAddTime(new Date());xxlJobInfo.setUpdateTime(new Date());xxlJobInfo.setAuthor("Test");xxlJobInfo.setAlarmEmail("1234567@com");xxlJobInfo.setScheduleType("CRON");xxlJobInfo.setScheduleConf("0/1 * * * * ?");xxlJobInfo.setMisfireStrategy("DO_NOTHING");xxlJobInfo.setExecutorRouteStrategy("FIRST");xxlJobInfo.setExecutorHandler("clockInJobHandler_1");xxlJobInfo.setExecutorParam("att");xxlJobInfo.setExecutorBlockStrategy("SERIAL_EXECUTION");xxlJobInfo.setExecutorTimeout(0);xxlJobInfo.setExecutorFailRetryCount(1);xxlJobInfo.setGlueType("BEAN");xxlJobInfo.setGlueSource("");xxlJobInfo.setGlueRemark("初始化");xxlJobInfo.setGlueUpdatetime(new Date());JSONObject test = (JSONObject) JSONObject.toJSON(xxlJobInfo);xxljob_login();JSONObject response = XxlJobUtil.addJob(adminAddresses, test);if (response.containsKey("code") && 200 == (Integer) response.get("code")) {String jobId = response.getString("content");System.out.println("新增成功,jobId:" + jobId);} else {System.out.println("新增失敗");}return response;}@RequestMapping(value = "/stop/{jobId}",method = RequestMethod.GET)public void stop(@PathVariable("jobId") Integer jobId) throws IOException {xxljob_login();JSONObject response = XxlJobUtil.stopJob(adminAddresses, jobId);if (response.containsKey("code") && 200 == (Integer) response.get("code")) {System.out.println("任務停止成功");} else {System.out.println("任務停止失敗");}}@RequestMapping(value = "/delete/{jobId}",method = RequestMethod.GET)public void delete(@PathVariable("jobId") Integer jobId) throws IOException {xxljob_login();JSONObject response = XxlJobUtil.deleteJob(adminAddresses, jobId);if (response.containsKey("code") && 200 == (Integer) response.get("code")) {System.out.println("任務移除成功");} else {System.out.println("任務移除失敗");}}@RequestMapping(value = "/start/{jobId}",method = RequestMethod.GET)public void start(@PathVariable("jobId") Integer jobId) throws IOException {xxljob_login();JSONObject response = XxlJobUtil.startJob(adminAddresses, jobId);if (response.containsKey("code") && 200 == (Integer) response.get("code")) {System.out.println("任務啟動成功");} else {System.out.println("任務啟動失敗");}}}