ElasticJob的作业分类基于classtype两种类型。基于class的作业需要开发者自行通过实现接口的方式织入业务逻辑;基于type的作业则无需编码,只需要提供相应配置即可。基于class的作业接口的方法参数shardingContext包含作业配置、片和运行时信息。可通过getShardingTotalCount()getShardingItem()等方法分别获取分片总数和运行在本作业服务器的分片序列号等。

ElasticJob目前提供SimpleDataflow这两种基于class的作业类型,并提供ScriptHTTP这两种基于type的作业类型,用户可通过实现SPI接口自行扩展作业类型。

本篇博客介绍HTTP作业。

添加依赖(3.0.1是目前最新的Releases版本):

        <dependency><groupId>org.apache.shardingsphere.elasticjob</groupId><artifactId>elasticjob-lite-core</artifactId><version>3.0.1</version></dependency>

HTTP作业

先搭建一个Spring Boot项目,在项目中定义一个接口。

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.kaven</groupId><artifactId>server</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.2.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
</project>

MessageController接口定义:

package com.kaven.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;import java.text.SimpleDateFormat;
import java.util.Date;/*** @Author: ITKaven* @Date: 2021/12/06 19:29* @Blog: https://kaven.blog.csdn.net* @Leetcode: https://leetcode-cn.com/u/kavenit* @Notes:*/@RestController
public class MessageController {private static final SimpleDateFormat formatter =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");private static final String MESSAGE_HEAD = "MessageController";@GetMapping("/message")public String getMessage(String messageBody, @RequestHeader String shardingContext) {String message = MESSAGE_HEAD + " " +  messageBody;System.out.println(formatter.format(new Date()) + " " + message + " - " + shardingContext);return message;}
}

Server启动类:

package com.kaven;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @Author: ITKaven* @Date: 2021/12/06 19:28* @Blog: https://kaven.blog.csdn.net* @Leetcode: https://leetcode-cn.com/u/kavenit* @Notes:*/@SpringBootApplication
public class Server {public static void main(String[] args) {SpringApplication.run(Server.class);}
}

Application类:

package com.kaven.job;import org.apache.shardingsphere.elasticjob.api.JobConfiguration;
import org.apache.shardingsphere.elasticjob.http.props.HttpJobProperties;
import org.apache.shardingsphere.elasticjob.lite.api.bootstrap.impl.ScheduleJobBootstrap;
import org.apache.shardingsphere.elasticjob.reg.base.CoordinatorRegistryCenter;
import org.apache.shardingsphere.elasticjob.reg.zookeeper.ZookeeperConfiguration;
import org.apache.shardingsphere.elasticjob.reg.zookeeper.ZookeeperRegistryCenter;/*** @Author: ITKaven* @Date: 2021/11/20 17:05* @Blog: https://kaven.blog.csdn.net* @Leetcode: https://leetcode-cn.com/u/kavenit* @Notes:*/
public class Application {public static void main(String[] args) {new ScheduleJobBootstrap(createRegistryCenter(), "HTTP",createJobConfiguration()).schedule();}private static CoordinatorRegistryCenter createRegistryCenter() {ZookeeperConfiguration zc = new ZookeeperConfiguration("192.168.1.184:9000", "my-job");zc.setConnectionTimeoutMilliseconds(40000);zc.setMaxRetries(5);CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(zc);regCenter.init();return regCenter;}private static JobConfiguration createJobConfiguration() {return JobConfiguration.newBuilder("MyHTTPJob", 3).description("HTTP作业").cron("30 * * * * ?").setProperty(HttpJobProperties.URI_KEY, "http://localhost:8080/message?messageBody=MyHTTPJob").setProperty(HttpJobProperties.METHOD_KEY, "GET")
//                .setProperty(HttpJobProperties.DATA_KEY, "messageBody=MyHTTPJob").overwrite(true).failover(true).build();}
}

定义HTTP作业也比较简单,只需要设置HTTP作业的相关参数,比如接口的URI、类型、参数以及连接超时时间等,HttpJobProperties.DATA_KEY用于给POST这类请求设置参数。

                .setProperty(HttpJobProperties.URI_KEY, "http://localhost:8080/message?messageBody=MyHTTPJob").setProperty(HttpJobProperties.METHOD_KEY, "GET")
//                .setProperty(HttpJobProperties.DATA_KEY, "messageBody=MyHTTPJob")

HttpJobProperties类:

package org.apache.shardingsphere.elasticjob.http.props;/*** HTTP job properties.*/
public final class HttpJobProperties {public static final String URI_KEY = "http.uri";public static final String METHOD_KEY = "http.method";public static final String DATA_KEY = "http.data";public static final String CONNECT_TIMEOUT_KEY = "http.connect.timeout.milliseconds";public static final String READ_TIMEOUT_KEY = "http.read.timeout.milliseconds";public static final String CONTENT_TYPE_KEY = "http.content.type";public static final String SHARDING_CONTEXT_KEY = "shardingContext";
}

输出如下图所示:

多参数接口

如果GET接口有多个参数,在URI上进行拼接即可。

                .setProperty(HttpJobProperties.URI_KEY, "http://localhost:8080/message?arg1=1&arg2=2")

而如果是POST接口有多个参数,就不能多次调用setProperty(HttpJobProperties.DATA_KEY, "key=value")来完成多个参数的传值,因为值会被覆盖(即只会取最后一次设置的值,ElasticJob使用JavaProperties来存储参数,而Properties继承Hashtable,当键相同时,值会被覆盖,而参数的键都是HttpJobProperties.DATA_KEY)。

    private static JobConfiguration createJobConfiguration() {return JobConfiguration.newBuilder("MyHTTPJob", 3).description("HTTP作业").cron("30 * * * * ?").setProperty(HttpJobProperties.URI_KEY, "http://localhost:8080/message").setProperty(HttpJobProperties.METHOD_KEY, "POST").setProperty(HttpJobProperties.DATA_KEY, "arg1=1").setProperty(HttpJobProperties.DATA_KEY, "arg2=2").overwrite(true).failover(true).build();}

接口:

package com.kaven.controller;import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;/*** @Author: ITKaven* @Date: 2021/12/06 19:29* @Blog: https://kaven.blog.csdn.net* @Leetcode: https://leetcode-cn.com/u/kavenit* @Notes:*/@RestController
public class MessageController {@PostMapping("/message")public void getMessage(String arg1, String arg2) {System.out.println(arg1 + arg2);}
}

输出如下图所示:

第一个参数被覆盖了,所以为null,因此给POST接口传多个参数,博主想到的方法是将多个参数组合成一个实例,再将其转换成JSON字符串,接口那边再将这个JSON字符串转换成对应的实例。大家如果有更好的方法可以评论区留言。

添加依赖:

        <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.9</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version><scope>provided</scope></dependency>

存储多个参数的Data类:

package com.kaven.job.data;import lombok.*;/*** @Author: ITKaven* @Date: 2021/12/07 14:33* @Blog: https://kaven.blog.csdn.net* @Leetcode: https://leetcode-cn.com/u/kavenit* @Notes:*/@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ToString
public class Data {private String username;private String password;private School school;@Setter@AllArgsConstructor@NoArgsConstructor@Builder@ToStringpublic static class School{private String name;private String address;}
}

Application类:

package com.kaven.job;import com.google.gson.Gson;
import com.kaven.job.data.Data;
import org.apache.shardingsphere.elasticjob.api.JobConfiguration;
import org.apache.shardingsphere.elasticjob.http.props.HttpJobProperties;
import org.apache.shardingsphere.elasticjob.lite.api.bootstrap.impl.ScheduleJobBootstrap;
import org.apache.shardingsphere.elasticjob.reg.base.CoordinatorRegistryCenter;
import org.apache.shardingsphere.elasticjob.reg.zookeeper.ZookeeperConfiguration;
import org.apache.shardingsphere.elasticjob.reg.zookeeper.ZookeeperRegistryCenter;/*** @Author: ITKaven* @Date: 2021/11/20 17:05* @Blog: https://kaven.blog.csdn.net* @Leetcode: https://leetcode-cn.com/u/kavenit* @Notes:*/
public class Application {public static void main(String[] args) {new ScheduleJobBootstrap(createRegistryCenter(), "HTTP",createJobConfiguration()).schedule();}private static CoordinatorRegistryCenter createRegistryCenter() {ZookeeperConfiguration zc = new ZookeeperConfiguration("192.168.1.184:9000", "my-job");zc.setConnectionTimeoutMilliseconds(40000);zc.setMaxRetries(5);CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(zc);regCenter.init();return regCenter;}private static JobConfiguration createJobConfiguration() {Data data = Data.builder().username("kaven").password("itkaven").school(Data.School.builder().name("xxx").address("中国").build()).build();String dataStr = (new Gson()).toJson(data);System.out.println(dataStr);return JobConfiguration.newBuilder("MyHTTPJob", 3).description("HTTP作业").cron("30 * * * * ?").setProperty(HttpJobProperties.URI_KEY, "http://localhost:8080/message").setProperty(HttpJobProperties.METHOD_KEY, "POST").setProperty(HttpJobProperties.DATA_KEY, "args=" + dataStr).overwrite(true).failover(true).build();}
}

下面这部分就是将要传的多个参数组合成Data实例,然后再将其转换成JSON字符串。

        Data data = Data.builder().username("kaven").password("itkaven").school(Data.School.builder().name("xxx").address("中国").build()).build();String dataStr = (new Gson()).toJson(data);

接口(将JSON字符串再转换成想要的包含多个参数信息的Data实例):

package com.kaven.controller;import com.google.gson.Gson;
import com.kaven.data.Data;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;import java.text.SimpleDateFormat;
import java.util.Date;/*** @Author: ITKaven* @Date: 2021/12/06 19:29* @Blog: https://kaven.blog.csdn.net* @Leetcode: https://leetcode-cn.com/u/kavenit* @Notes:*/@RestController
public class MessageController {private static final SimpleDateFormat formatter =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");private static final String MESSAGE_HEAD = "MessageController";@PostMapping("/message")public void getMessage(String args, @RequestHeader String shardingContext) {Gson gson = new Gson();Data data = gson.fromJson(args, Data.class);System.out.println(formatter.format(new Date()) + " " + data + " " + shardingContext);}
}

输出如下图所示:

HTTP作业就介绍到这里,如果博主有说错的地方或者大家有不同的见解,欢迎大家评论补充。

ElasticJob‐Lite:HTTP作业相关推荐

  1. ElasticJob‐Lite:Script作业

    ElasticJob的作业分类基于class和type两种类型.基于class的作业需要开发者自行通过实现接口的方式织入业务逻辑:基于type的作业则无需编码,只需要提供相应配置即可.基于class的 ...

  2. ElasticJob Lite Console 处于分片待调整状态,无法触发解决方案

    将对应job的触发时间改成最近的,比如当前时间17:49:00,那就把Cron表达式改成下一分钟:0 50 17 * * ? ,当自动触发过一次后,状态就会变成 因为要触发过,才会让你操作. 记得,改 ...

  3. 王者归来:分布式调度解决方案 ElasticJob 重启!

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 你会误认为 ElasticJob 只是作业管控平台么?创 ...

  4. 停滞数年后,ElasticJob 携首个 Apache 版本 3.0.0-alpha 回归!

    作者 | 张亮,Apache ShardingSphere PMC Chair 责编 | 夕颜 头图 | CSDN 出品 | CSDN(ID:CSDNnews) 在成为 Apache Sharding ...

  5. 【elastic-job】elastic-job部署以及简单例子

    一.elastic-job是什么 elastic-job是当当开发的基于qutarz以及zookeeper封装的作业调度工具,主要有两个大框架,一个是elastic-job lite另外一个是elas ...

  6. 【分布式任务调度】二、Elastic-Job详细介绍

    Elastic-Job 一.What is elastic-job? Elastic-Job-Lite Elastic-Job-Cloud Elastic-job开发环境要求 Elastic-Job配 ...

  7. 分布式调度框架Elastic-Job

    1.Elastic-Job介绍 Elastic-Job是当当网开源的⼀个分布式调度解决方案,基于Quartz二次开发的,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job- ...

  8. 【手把手】分布式定时任务调度解析之Elastic-Job

    1.这货怎么没怎么听过 经常使用Quartz或者Spring Task的小伙伴们,或多或少都会遇到几个痛点,比如: 1.不敢轻易跟着应用服务多节点部署,可能会重复多次执行而引发系统逻辑的错误: 2.Q ...

  9. elastic-job的原理简介和使用

    elastic-job是当当开源的一款非常好用的作业框架,在这之前,我们开发定时任务一般都是使用quartz或者spring-task(ScheduledExecutorService),无论是使用q ...

最新文章

  1. java对象转xml 高性能_通过实例学习JAVA对象转成XML输出
  2. C#使用 SharpSSH
  3. UVA10780幂和阶乘
  4. nodejs基础学习-文件读取
  5. detachedcriteria查询去重_2020考研初试成绩查询:安徽研究生考试成绩查询入口
  6. mysql数据库英文句子翻译_MySQL文档翻译(八)附英文原文---性能优化概览
  7. android studio transformclasseswithJarMergingForDebug报错
  8. SQL相关路径查询脚本
  9. NginxJava笔记-Webservice使用HTTPS协议及Spring Boot配置tomcat
  10. HTML5 3D翻书效果(双面效应)
  11. jstl.jar和standar.jar包下载
  12. 骄傲地宣布一件事:月入3万的目标还没实现
  13. java报错symbol_java 报错cannot resolve symbol问题
  14. 程序员,别太把技术入股当做一回事
  15. android保存播放进度,Android MediaPlayer控制进度播放音频
  16. 怎样打印微信文档文件?
  17. 一个表写给另一个表的情书!
  18. download sources报错: Cannot connect to the Maven process. Try again later. If the problem persists
  19. abp+dapper+mysql_abp集成abp.Dapper
  20. 十进制的小数如何转二进制?二进制表示的小数如何转十进制?

热门文章

  1. 在艳遇的6个小时里,我们都说了啥?
  2. PS流详解(载荷H264)
  3. 2021年五大进销存软件排名,助力门店精细化管理必看
  4. 2022年第十三届蓝桥杯比赛Java B组 【全部真题答案解析-第一部分】
  5. 禁止Debian 10自动休眠
  6. 机器学习:参数模型、非参数模型
  7. 【iPhone4s降级】2021年初自制固件降级IOS6.1.3
  8. EAS运行期license过期的解决办法。
  9. windows彻底卸载python的方法
  10. ap计算机知识点总结,AP Calculus(ABBC)知识点总结