From b82f9c8e26118947cbe91a2893bdcc69124f8eea Mon Sep 17 00:00:00 2001 From: wyl <959814898@qq.com> Date: Tue, 26 Apr 2022 23:50:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95xxjob?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 19 ++- redis/pom.xml | 25 ++++ .../com/wyl/demo/redission/RedisLock.java | 31 ++++ .../com/wyl/demo/redission/RedisObject.java | 16 ++ .../wyl/demo/redission/conf/RedissonConf.java | 32 ++++ .../com/wyl/demo/redission/RedissonTest.java | 57 +++++++ spring-boot/pom.xml | 3 +- spring-boot/spring-boot-xxjob/pom.xml | 68 +++++++++ .../SpringBootXxjobApplication.java | 13 ++ .../config/JobServerConfig.java | 46 ++++++ .../config/RestTemplateConfig.java | 34 +++++ .../service/DynamicXxlJobService.java | 140 ++++++++++++++++++ .../src/main/resources/application.properties | 7 + .../com/wyl/springbootxxjob/BaseTest.java | 15 ++ .../SpringBootXxjobApplicationTests.java | 17 +++ 15 files changed, 521 insertions(+), 2 deletions(-) create mode 100644 redis/pom.xml create mode 100644 redis/src/main/java/com/wyl/demo/redission/RedisLock.java create mode 100644 redis/src/main/java/com/wyl/demo/redission/RedisObject.java create mode 100644 redis/src/main/java/com/wyl/demo/redission/conf/RedissonConf.java create mode 100644 redis/src/test/java/com/wyl/demo/redission/RedissonTest.java create mode 100644 spring-boot/spring-boot-xxjob/pom.xml create mode 100644 spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/SpringBootXxjobApplication.java create mode 100644 spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/config/JobServerConfig.java create mode 100644 spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/config/RestTemplateConfig.java create mode 100644 spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/service/DynamicXxlJobService.java create mode 100644 spring-boot/spring-boot-xxjob/src/main/resources/application.properties create mode 100644 spring-boot/spring-boot-xxjob/src/test/java/com/wyl/springbootxxjob/BaseTest.java create mode 100644 spring-boot/spring-boot-xxjob/src/test/java/com/wyl/springbootxxjob/SpringBootXxjobApplicationTests.java diff --git a/pom.xml b/pom.xml index af47679..80de8b4 100644 --- a/pom.xml +++ b/pom.xml @@ -14,6 +14,7 @@ file-read kafka spring-boot + redis pom @@ -27,13 +28,24 @@ cglib 3.3.0 + + org.redisson + redisson + 3.13.4 + org.apache.kafka kafka-clients 2.8.1 + + com.xuxueli + xxl-job-core + 2.3.0 + + @@ -47,6 +59,12 @@ 5.8.2 test + + org.junit.jupiter + junit-jupiter-api + 5.8.2 + test + ch.qos.logback logback-core @@ -57,6 +75,5 @@ logback-classic 1.2.3 - \ No newline at end of file diff --git a/redis/pom.xml b/redis/pom.xml new file mode 100644 index 0000000..2451091 --- /dev/null +++ b/redis/pom.xml @@ -0,0 +1,25 @@ + + + + JavaBasiceDemo + com.wyl.example + 1.0-SNAPSHOT + + 4.0.0 + + redis + + + 8 + 8 + + + + org.redisson + redisson + + + + \ No newline at end of file diff --git a/redis/src/main/java/com/wyl/demo/redission/RedisLock.java b/redis/src/main/java/com/wyl/demo/redission/RedisLock.java new file mode 100644 index 0000000..59146be --- /dev/null +++ b/redis/src/main/java/com/wyl/demo/redission/RedisLock.java @@ -0,0 +1,31 @@ +package com.wyl.demo.redission; + +import com.wyl.demo.redission.conf.RedissonConf; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; + +public class RedisLock extends Thread { + + static RedissonClient redissonClient = RedissonConf.getRedissonClient(); + + @Override + public void run() { + lock(); + } + + public void lock() { + RLock lock = redissonClient.getLock("wyl_lock"); + lock.lock(); + try { + System.out.println("获取到锁了"); + Thread.sleep(5000000); + } + catch (InterruptedException e) { + System.err.println(e); + } + finally { + System.out.println("解锁了"); + lock.unlock(); + } + } +} diff --git a/redis/src/main/java/com/wyl/demo/redission/RedisObject.java b/redis/src/main/java/com/wyl/demo/redission/RedisObject.java new file mode 100644 index 0000000..6ea5472 --- /dev/null +++ b/redis/src/main/java/com/wyl/demo/redission/RedisObject.java @@ -0,0 +1,16 @@ +package com.wyl.demo.redission; + +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.List; + +@Data +public class RedisObject implements Serializable { + String name; + LocalDateTime createTime; + Long time; + List tmp = Arrays.asList("123", "234", "345"); +} diff --git a/redis/src/main/java/com/wyl/demo/redission/conf/RedissonConf.java b/redis/src/main/java/com/wyl/demo/redission/conf/RedissonConf.java new file mode 100644 index 0000000..26a2cab --- /dev/null +++ b/redis/src/main/java/com/wyl/demo/redission/conf/RedissonConf.java @@ -0,0 +1,32 @@ +package com.wyl.demo.redission.conf; + +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; + +/** + * + * @ClassName: RedissonConf + * @Date: 2022/3/3 22:37 + * @author wangyl + * @version V1.0 + */ +public class RedissonConf { + + private volatile static RedissonClient redissonClient; + + public static RedissonClient getRedissonClient() { + if (redissonClient == null) { + synchronized (RedissonConf.class) { + if (redissonClient == null) { + Config config = new Config(); + config.useSingleServer() + .setAddress("redis://192.168.123.102:6379") + .setDatabase(0); + return Redisson.create(config); + } + } + } + return redissonClient; + } +} diff --git a/redis/src/test/java/com/wyl/demo/redission/RedissonTest.java b/redis/src/test/java/com/wyl/demo/redission/RedissonTest.java new file mode 100644 index 0000000..0169519 --- /dev/null +++ b/redis/src/test/java/com/wyl/demo/redission/RedissonTest.java @@ -0,0 +1,57 @@ +package com.wyl.demo.redission; + +import com.wyl.demo.redission.conf.RedissonConf; +import org.junit.jupiter.api.Test; +import org.redisson.api.RAtomicDouble; +import org.redisson.api.RBloomFilter; +import org.redisson.api.RBucket; +import org.redisson.api.RedissonClient; + +import java.time.LocalDateTime; +import java.util.concurrent.TimeUnit; + +public class RedissonTest { + @Test + public void RedisStringTest() { + RedissonClient redissonClient = RedissonConf.getRedissonClient(); + RAtomicDouble wyl = redissonClient.getAtomicDouble("wyl"); + double v = wyl.get(); + System.out.println(v); + } + + @Test + public void RedisBloomFilterTest() { + RedissonClient redissonClient = RedissonConf.getRedissonClient(); + RBloomFilter bloomFilter = redissonClient.getBloomFilter("bloomFilter"); + bloomFilter.tryInit(100, 0); + bloomFilter.add("123"); + bloomFilter.add("124"); + boolean contains = bloomFilter.contains("456"); + long count = bloomFilter.count(); + boolean contains1 = bloomFilter.contains("123"); + System.out.println(count); + } + + @Test + public void RedisObjectTest() { + RedissonClient redissonClient = RedissonConf.getRedissonClient(); + RedisObject redisObject = new RedisObject(); + redisObject.setName("1230"); + redisObject.setCreateTime(LocalDateTime.now()); + redisObject.setTime(123L); + RBucket testObject = redissonClient.getBucket("testObject"); + if (!testObject.isExists()) { + testObject.set(redisObject, 10, TimeUnit.SECONDS); + } + RedisObject redisObject1 = testObject.get(); + System.out.println(redisObject1); + } + + @Test + public void RedisLockTest() throws InterruptedException { + for (int i = 0; i < 100; i++){ + new RedisLock().start(); + } + Thread.sleep(1000000); + } +} diff --git a/spring-boot/pom.xml b/spring-boot/pom.xml index 77d1730..ea27a3a 100644 --- a/spring-boot/pom.xml +++ b/spring-boot/pom.xml @@ -10,11 +10,12 @@ 4.0.0 spring-boot-drools + spring-boot-xxjob spring-boot pom - A Camel Spring Route + spring-boot UTF-8 UTF-8 diff --git a/spring-boot/spring-boot-xxjob/pom.xml b/spring-boot/spring-boot-xxjob/pom.xml new file mode 100644 index 0000000..63d7da1 --- /dev/null +++ b/spring-boot/spring-boot-xxjob/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + + com.wyl.example + spring-boot + 1.0-SNAPSHOT + ../pom.xml + + com.wyl + spring-boot-xxjob + 0.0.1-SNAPSHOT + spring-boot-xxjob + Demo project for Spring Boot + + 1.8 + + + + org.springframework.boot + spring-boot-starter-web + + + + com.xuxueli + xxl-job-core + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + com.alibaba + fastjson + 1.2.78 + compile + + + com.squareup.okhttp3 + okhttp + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/SpringBootXxjobApplication.java b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/SpringBootXxjobApplication.java new file mode 100644 index 0000000..dd65bc3 --- /dev/null +++ b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/SpringBootXxjobApplication.java @@ -0,0 +1,13 @@ +package com.wyl.springbootxxjob; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootXxjobApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringBootXxjobApplication.class, args); + } + +} diff --git a/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/config/JobServerConfig.java b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/config/JobServerConfig.java new file mode 100644 index 0000000..8809915 --- /dev/null +++ b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/config/JobServerConfig.java @@ -0,0 +1,46 @@ +package com.wyl.springbootxxjob.config; + +import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Slf4j +@Configuration +@Getter +public class JobServerConfig { + + @Value("${job.server.admin.addresses}") + private String adminAddresses; + + @Value("${job.server.accessToken}") + private String accessToken; + + @Value("${job.server.executor.appname}") + private String appname; + + @Value("${job.server.executor.address}") + private String address; + + @Value("${job.server.userName}") + private String userName; + + @Value("${job.server.password}") + private String password; + + @Value("${job.server.jobGroup}") + private String jobGroup; + + @Bean + public XxlJobSpringExecutor xxlJobExecutor() { + log.info(">>>>>>>>>>> job-server config init."); + XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); + xxlJobSpringExecutor.setAdminAddresses(adminAddresses); + xxlJobSpringExecutor.setAppname(appname); + xxlJobSpringExecutor.setAddress(address); + xxlJobSpringExecutor.setAccessToken(accessToken); + return xxlJobSpringExecutor; + } +} diff --git a/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/config/RestTemplateConfig.java b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/config/RestTemplateConfig.java new file mode 100644 index 0000000..1c9af2e --- /dev/null +++ b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/config/RestTemplateConfig.java @@ -0,0 +1,34 @@ +package com.wyl.springbootxxjob.config; + +import okhttp3.OkHttpClient; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.OkHttp3ClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +import java.util.concurrent.TimeUnit; + +@Configuration +public class RestTemplateConfig { + + @ConditionalOnMissingBean(RestTemplate.class) + @Bean + public RestTemplate restTemplate() { + RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory()); + return restTemplate; + } + + /** + * 使用OkHttpClient作为底层客户端 + * @return + */ + private ClientHttpRequestFactory getClientHttpRequestFactory() { + OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(5, TimeUnit.SECONDS) + .writeTimeout(5, TimeUnit.SECONDS) + .readTimeout(5, TimeUnit.SECONDS) + .build(); + return new OkHttp3ClientHttpRequestFactory(okHttpClient); + } +} \ No newline at end of file diff --git a/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/service/DynamicXxlJobService.java b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/service/DynamicXxlJobService.java new file mode 100644 index 0000000..31fd7ff --- /dev/null +++ b/spring-boot/spring-boot-xxjob/src/main/java/com/wyl/springbootxxjob/service/DynamicXxlJobService.java @@ -0,0 +1,140 @@ +package com.wyl.springbootxxjob.service; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.wyl.springbootxxjob.config.JobServerConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; +import javax.annotation.Resource; + +@Service +public class DynamicXxlJobService { + + @Resource + private JobServerConfig jobServerConfig; + + @Autowired + RestTemplate restTemplate; + + /** + * 创建固定任务 + * + * @param desc 任务描述 + * @param corn cron 表达式 + * @param param param + * @return jobId + */ + private int createJob(String cookie, String desc, String corn, String param) { + + int jobId = -1; + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + paramMap.add("jobGroup", jobServerConfig.getJobGroup()); + paramMap.add("jobDesc", desc); + paramMap.add("author", "system_patrol"); + paramMap.add("scheduleType", "CRON"); + paramMap.add("scheduleConf", corn); + paramMap.add("cronGen_display", corn); + paramMap.add("glueType", "BEAN"); + paramMap.add("executorHandler", "patrolGenerateHandler"); + paramMap.add("executorParam", param); + paramMap.add("executorRouteStrategy", "FIRST"); + paramMap.add("misfireStrategy", "DO_NOTHING"); + paramMap.add("executorBlockStrategy", "SERIAL_EXECUTION"); + paramMap.add("executorTimeout", "0"); + paramMap.add("executorFailRetryCount", "0"); + paramMap.add("glueRemark", "GLUE代码初始化"); + paramMap.add("cookie", cookie); + String s = post("", paramMap); + JSONObject jsonObject = JSON.parseObject(s); + int code = jsonObject.getIntValue("code"); + if (code == 200) { + jobId = jsonObject.getIntValue("content"); + } + + return jobId; + } + + + /** + * 启动固定任务 + * @param cookie cookie + * @param jobId jobId + * @return 启动固定任务 + */ + private boolean start(String cookie, int jobId) { + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + paramMap.add("id", String.valueOf(jobId)); + paramMap.add("cookie", "cookie"); + String s = post("", paramMap); + JSONObject jsonObject = JSON.parseObject(s); + int code = jsonObject.getIntValue("code"); + if (code == 200) { + return true; + } + return false; + } + + + /** + * 删除固定任务 + * @param cookie cookie + * @param jobId jobId + * @return 启动固定任务 + */ + public boolean remove(String cookie, int jobId) { + MultiValueMap paramMap = new LinkedMultiValueMap<>(); + paramMap.add("id", String.valueOf(jobId)); + String s = post("", paramMap); + JSONObject jsonObject = JSON.parseObject(s); + int code = jsonObject.getInteger("code"); + if (code == 200) { + return true; + } + return false; + } + + /** + * 获取cookie + * @return 返回cookie值 + */ + public String getCookie() { + String path = jobServerConfig.getAdminAddresses() + "/login"; + + // 请求头设置,x-www-form-urlencoded格式的数据 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + + //提交参数设置 + MultiValueMap hashMap = new LinkedMultiValueMap<>(); + // 组装请求体 + hashMap.add("userName", jobServerConfig.getUserName()); + hashMap.add("password", jobServerConfig.getPassword()); + HttpEntity> request = new HttpEntity<>(hashMap, headers); + ResponseEntity stringResponseEntity = restTemplate.postForEntity(path, request, String.class); + return stringResponseEntity.toString(); +// +// List cookies = response.getCookies(); +// StringBuilder sb = new StringBuilder(); +// for (HttpCookie cookie : cookies) { +// sb.append(cookie.toString()); +// } +// return sb.toString(); + } + + public String post(String url, MultiValueMap hashMap) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + HttpEntity> request = new HttpEntity<>(hashMap, headers); + ResponseEntity stringResponseEntity = restTemplate.postForEntity(url, request, String.class); + return stringResponseEntity.getBody(); + } + +} + diff --git a/spring-boot/spring-boot-xxjob/src/main/resources/application.properties b/spring-boot/spring-boot-xxjob/src/main/resources/application.properties new file mode 100644 index 0000000..951ef5b --- /dev/null +++ b/spring-boot/spring-boot-xxjob/src/main/resources/application.properties @@ -0,0 +1,7 @@ +job.server.admin.addresses=http://192.168.123.102:9090/xxl-job-admin +job.server.accessToken=1 +job.server.executor.appname= asd +job.server.executor.address= 192.168.123.148 +job.server.userName=admin +job.server.password=123456 +job.server.jobGroup=1 \ No newline at end of file diff --git a/spring-boot/spring-boot-xxjob/src/test/java/com/wyl/springbootxxjob/BaseTest.java b/spring-boot/spring-boot-xxjob/src/test/java/com/wyl/springbootxxjob/BaseTest.java new file mode 100644 index 0000000..40dc8b9 --- /dev/null +++ b/spring-boot/spring-boot-xxjob/src/test/java/com/wyl/springbootxxjob/BaseTest.java @@ -0,0 +1,15 @@ +package com.wyl.springbootxxjob; + +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseTest.Application.class) +public class BaseTest { + @ComponentScan(value = "com.wyl.springbootxxjob") + public static class Application { + + } +} \ No newline at end of file diff --git a/spring-boot/spring-boot-xxjob/src/test/java/com/wyl/springbootxxjob/SpringBootXxjobApplicationTests.java b/spring-boot/spring-boot-xxjob/src/test/java/com/wyl/springbootxxjob/SpringBootXxjobApplicationTests.java new file mode 100644 index 0000000..39d99ae --- /dev/null +++ b/spring-boot/spring-boot-xxjob/src/test/java/com/wyl/springbootxxjob/SpringBootXxjobApplicationTests.java @@ -0,0 +1,17 @@ +package com.wyl.springbootxxjob; + +import com.wyl.springbootxxjob.service.DynamicXxlJobService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +class SpringBootXxjobApplicationTests extends BaseTest{ + + @Autowired + DynamicXxlJobService dynamicXxlJobService; + @Test + void contextLoads() { + dynamicXxlJobService.getCookie(); + } + +}