feat(scheduler): 迁移service-scheduler项目

This commit is contained in:
2024-02-28 15:20:52 +08:00
parent 14409ae798
commit f258bfe5b0
29 changed files with 1658 additions and 0 deletions

View File

@@ -0,0 +1,197 @@
package com.lanyuanxiaoyao.service.configuration.utils;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.eshore.odcp.hudi.connector.Constants;
import com.eshore.odcp.hudi.connector.entity.compaction.ScheduleJob;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.lanyuanxiaoyao.service.configuration.entity.queue.QueueItem;
import dev.failsafe.Failsafe;
import dev.failsafe.RetryPolicy;
import java.time.Duration;
import java.util.List;
import org.eclipse.collections.api.factory.Lists;
import org.eclipse.collections.api.list.ImmutableList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
/**
* 队列操作
*
* @author lanyuanxiaoyao
* @date 2023-05-08
*/
public class QueueUtil {
private static final Logger logger = LoggerFactory.getLogger(QueueUtil.class);
private static final RetryPolicy<Object> RETRY = RetryPolicy.builder()
.handle(Throwable.class)
.withDelay(Duration.ofSeconds(5))
.withMaxAttempts(12)
.build();
private static String getQueueUrl(DiscoveryClient client) {
List<ServiceInstance> instances = client.getInstances("service-queue");
if (ObjectUtil.isEmpty(instances)) {
logger.info("Current instances: {}", String.join(",", client.getServices()));
throw new RuntimeException("Queue instance not found");
}
return instances.get(0).getUri().toString();
}
public static ImmutableList<String> names(DiscoveryClient client, ObjectMapper mapper) {
return Failsafe.with(RETRY)
.get(() -> {
try (HttpResponse response = HttpUtil.createGet(URLUtil.completeUrl(getQueueUrl(client), "/names"))
.basicAuth(Constants.SPRING_SECURITY_USERNAME, Constants.SPRING_SECURITY_PASSWORD_PLAIN)
.execute()) {
if (response.isOk()) {
return mapper.readValue(response.body(), new TypeReference<ImmutableList<String>>() {
});
}
return Lists.immutable.empty();
}
});
}
public static Boolean add(DiscoveryClient client, ObjectMapper mapper, String name, QueueItem<ScheduleJob> job) {
try {
if (ObjectUtil.isNull(job)) {
logger.warn("Job cannot be null");
return false;
}
String body = mapper.writeValueAsString(job);
if (StrUtil.isBlank(body)) {
logger.error("Body cannot be blank");
return false;
}
return Failsafe.with(RETRY)
.get(() -> {
try (HttpResponse response = HttpUtil.createPost(URLUtil.completeUrl(getQueueUrl(client), StrUtil.format("/queue/add?name={}", name)))
.basicAuth(Constants.SPRING_SECURITY_USERNAME, Constants.SPRING_SECURITY_PASSWORD_PLAIN)
.body(body)
.execute()) {
if (response.isOk()) {
return Boolean.valueOf(response.body());
}
return false;
}
});
} catch (Throwable e) {
logger.error("Add job to queue error", e);
}
return false;
}
public static QueueItem<ScheduleJob> poll(DiscoveryClient client, ObjectMapper mapper, String name) {
try {
return Failsafe.with(RETRY)
.get(() -> {
try (HttpResponse response = HttpUtil.createGet(URLUtil.completeUrl(getQueueUrl(client), StrUtil.format("/queue/poll?name={}", name)))
.basicAuth(Constants.SPRING_SECURITY_USERNAME, Constants.SPRING_SECURITY_PASSWORD_PLAIN)
.execute()) {
if (response.isOk()) {
String body = response.body();
if (StrUtil.isNotBlank(body)) {
try {
return mapper.readValue(body, new TypeReference<QueueItem<ScheduleJob>>() {
});
} catch (Throwable error) {
logger.error("Schedule job parse error", error);
}
}
}
return null;
}
});
} catch (Throwable e) {
logger.error("Poll job from queue error", e);
}
return null;
}
public static Boolean isEmpty(DiscoveryClient client, String name) {
try {
try (HttpResponse response = HttpUtil.createGet(URLUtil.completeUrl(getQueueUrl(client), StrUtil.format("/queue/is_empty?name={}", name)))
.basicAuth(Constants.SPRING_SECURITY_USERNAME, Constants.SPRING_SECURITY_PASSWORD_PLAIN)
.execute()) {
if (response.isOk()) {
String body = response.body();
if (StrUtil.isNotBlank(body)) {
return Boolean.valueOf(body);
}
}
return true;
}
} catch (Throwable e) {
logger.error("Query empty failure", e);
}
return true;
}
public static Integer size(DiscoveryClient client, String name) {
try {
try (HttpResponse response = HttpUtil.createGet(URLUtil.completeUrl(getQueueUrl(client), StrUtil.format("/queue/size?name={}", name)))
.basicAuth(Constants.SPRING_SECURITY_USERNAME, Constants.SPRING_SECURITY_PASSWORD_PLAIN)
.execute()) {
if (response.isOk()) {
String body = response.body();
if (StrUtil.isNotBlank(body)) {
return Integer.valueOf(body);
}
}
return -1;
}
} catch (Throwable e) {
logger.error("Query empty failure", e);
}
return -1;
}
public static Boolean remove(DiscoveryClient client, String name, String id) {
try {
try (HttpResponse response = HttpUtil.createGet(URLUtil.completeUrl(getQueueUrl(client), StrUtil.format("/queue/remove_all_id?name={}&id={}", name, id)))
.basicAuth(Constants.SPRING_SECURITY_USERNAME, Constants.SPRING_SECURITY_PASSWORD_PLAIN)
.execute()) {
if (response.isOk()) {
return Boolean.valueOf(response.body());
}
return true;
}
} catch (Throwable e) {
logger.error(StrUtil.format("Remove {} failure", id), e);
}
return false;
}
public static Boolean remove(DiscoveryClient client, ObjectMapper mapper, String name, ImmutableList<String> ids) {
try {
String body = mapper.writeValueAsString(ids);
if (StrUtil.isBlank(body)) {
logger.error("Body cannot be blank");
return false;
}
try (HttpResponse response = HttpUtil.createPost(URLUtil.completeUrl(getQueueUrl(client), StrUtil.format("/queue/remove_all_id?name={}", name)))
.basicAuth(Constants.SPRING_SECURITY_USERNAME, Constants.SPRING_SECURITY_PASSWORD_PLAIN)
.body(body)
.execute()) {
if (response.isOk()) {
return Boolean.valueOf(response.body());
}
return true;
}
} catch (Throwable e) {
logger.error(StrUtil.format("Remove {} failure", ids), e);
}
return false;
}
public interface Function<F, T> {
T apply(F f) throws Throwable;
}
}