From 4fe2d7fdf143f51bd522ecba16f975b3b77fa97e Mon Sep 17 00:00:00 2001 From: tjq Date: Thu, 21 Nov 2024 22:53:57 +0800 Subject: [PATCH] feat: Add PowerjobClient api /queryInstance #1034 --- .../tech/powerjob/client/IPowerJobClient.java | 3 ++ .../tech/powerjob/client/PowerJobClient.java | 8 ++++ .../java/tech/powerjob/client/TypeStore.java | 2 + .../tech/powerjob/client/test/TestClient.java | 13 ++++++ .../tech/powerjob/client/test/TestUtils.java | 17 ++++++++ .../request/query/InstancePageQuery.java | 33 +++++++++++++++ .../common/request/query/PowerPageQuery.java | 41 ++++++++++++++++++ .../powerjob/common/response/PageResult.java | 42 +++++++++++++++++++ .../server/core/instance/InstanceService.java | 29 +++++++++---- .../server/persistence/QueryConvertUtils.java | 30 +++++++++++-- .../server/openapi/OpenAPIController.java | 4 +- 11 files changed, 209 insertions(+), 13 deletions(-) create mode 100644 powerjob-client/src/test/java/tech/powerjob/client/test/TestUtils.java create mode 100644 powerjob-common/src/main/java/tech/powerjob/common/request/query/InstancePageQuery.java create mode 100644 powerjob-common/src/main/java/tech/powerjob/common/request/query/PowerPageQuery.java create mode 100644 powerjob-common/src/main/java/tech/powerjob/common/response/PageResult.java diff --git a/powerjob-client/src/main/java/tech/powerjob/client/IPowerJobClient.java b/powerjob-client/src/main/java/tech/powerjob/client/IPowerJobClient.java index 0df519b1..e489297c 100644 --- a/powerjob-client/src/main/java/tech/powerjob/client/IPowerJobClient.java +++ b/powerjob-client/src/main/java/tech/powerjob/client/IPowerJobClient.java @@ -3,6 +3,7 @@ package tech.powerjob.client; import tech.powerjob.common.request.http.SaveJobInfoRequest; import tech.powerjob.common.request.http.SaveWorkflowNodeRequest; import tech.powerjob.common.request.http.SaveWorkflowRequest; +import tech.powerjob.common.request.query.InstancePageQuery; import tech.powerjob.common.request.query.JobInfoQuery; import tech.powerjob.common.response.*; @@ -50,6 +51,8 @@ public interface IPowerJobClient { ResultDTO fetchInstanceInfo(Long instanceId); + ResultDTO> queryInstanceInfo(InstancePageQuery instancePageQuery); + /* ************* Workflow API list ************* */ ResultDTO saveWorkflow(SaveWorkflowRequest request); diff --git a/powerjob-client/src/main/java/tech/powerjob/client/PowerJobClient.java b/powerjob-client/src/main/java/tech/powerjob/client/PowerJobClient.java index f2e668ce..3c454516 100644 --- a/powerjob-client/src/main/java/tech/powerjob/client/PowerJobClient.java +++ b/powerjob-client/src/main/java/tech/powerjob/client/PowerJobClient.java @@ -17,6 +17,7 @@ import tech.powerjob.common.exception.PowerJobException; import tech.powerjob.common.request.http.SaveJobInfoRequest; import tech.powerjob.common.request.http.SaveWorkflowNodeRequest; import tech.powerjob.common.request.http.SaveWorkflowRequest; +import tech.powerjob.common.request.query.InstancePageQuery; import tech.powerjob.common.request.query.JobInfoQuery; import tech.powerjob.common.response.*; import tech.powerjob.common.serialize.JsonUtils; @@ -335,6 +336,13 @@ public class PowerJobClient implements IPowerJobClient, Closeable { return JSON.parseObject(post, INSTANCE_RESULT_TYPE); } + @Override + public ResultDTO> queryInstanceInfo(InstancePageQuery instancePageQuery) { + instancePageQuery.setAppIdEq(appId); + String post = requestService.request(OpenAPIConstant.QUERY_INSTANCE, PowerRequestBody.newJsonRequestBody(instancePageQuery)); + return JSON.parseObject(post, PAGE_INSTANCE_RESULT_TYPE); + } + /* ************* Workflow API list ************* */ /** diff --git a/powerjob-client/src/main/java/tech/powerjob/client/TypeStore.java b/powerjob-client/src/main/java/tech/powerjob/client/TypeStore.java index c3c23406..2c19460e 100644 --- a/powerjob-client/src/main/java/tech/powerjob/client/TypeStore.java +++ b/powerjob-client/src/main/java/tech/powerjob/client/TypeStore.java @@ -32,6 +32,8 @@ public class TypeStore { public static final TypeReference>> LIST_INSTANCE_RESULT_TYPE = new TypeReference>>(){}; + public static final TypeReference>> PAGE_INSTANCE_RESULT_TYPE = new TypeReference>>(){}; + public static final TypeReference> WF_RESULT_TYPE = new TypeReference>() {}; public static final TypeReference> WF_INSTANCE_RESULT_TYPE = new TypeReference>() {}; diff --git a/powerjob-client/src/test/java/tech/powerjob/client/test/TestClient.java b/powerjob-client/src/test/java/tech/powerjob/client/test/TestClient.java index ac5658d6..9c1b30c0 100644 --- a/powerjob-client/src/test/java/tech/powerjob/client/test/TestClient.java +++ b/powerjob-client/src/test/java/tech/powerjob/client/test/TestClient.java @@ -1,6 +1,7 @@ package tech.powerjob.client.test; import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -9,6 +10,7 @@ import tech.powerjob.common.enums.ExecuteType; import tech.powerjob.common.enums.ProcessorType; import tech.powerjob.common.enums.TimeExpressionType; import tech.powerjob.common.request.http.SaveJobInfoRequest; +import tech.powerjob.common.request.query.InstancePageQuery; import tech.powerjob.common.response.InstanceInfoDTO; import tech.powerjob.common.response.JobInfoDTO; import tech.powerjob.common.response.ResultDTO; @@ -113,6 +115,17 @@ class TestClient extends ClientInitializer { Assertions.assertNotNull(res); } + @Test + void testQueryInstanceInfo() { + InstancePageQuery instancePageQuery = new InstancePageQuery(); + instancePageQuery.setJobIdEq(11L); + instancePageQuery.setSortBy("actualTriggerTime"); + instancePageQuery.setAsc(true); + instancePageQuery.setPageSize(3); + instancePageQuery.setStatusIn(Lists.newArrayList(1,2,5)); + TestUtils.output(powerJobClient.queryInstanceInfo(instancePageQuery)); + } + @Test void testStopInstance() { ResultDTO res = powerJobClient.stopInstance(702482902331424832L); diff --git a/powerjob-client/src/test/java/tech/powerjob/client/test/TestUtils.java b/powerjob-client/src/test/java/tech/powerjob/client/test/TestUtils.java new file mode 100644 index 00000000..e09f4071 --- /dev/null +++ b/powerjob-client/src/test/java/tech/powerjob/client/test/TestUtils.java @@ -0,0 +1,17 @@ +package tech.powerjob.client.test; + +import com.alibaba.fastjson.JSONObject; + +/** + * TestUtils + * + * @author tjq + * @since 2024/11/21 + */ +public class TestUtils { + + public static void output(Object v) { + String str = JSONObject.toJSONString(v); + System.out.println(str); + } +} diff --git a/powerjob-common/src/main/java/tech/powerjob/common/request/query/InstancePageQuery.java b/powerjob-common/src/main/java/tech/powerjob/common/request/query/InstancePageQuery.java new file mode 100644 index 00000000..dff4c6f0 --- /dev/null +++ b/powerjob-common/src/main/java/tech/powerjob/common/request/query/InstancePageQuery.java @@ -0,0 +1,33 @@ +package tech.powerjob.common.request.query; + +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; +import java.util.List; + +/** + * 任务实例分页查询 + * + * @author tjq + * @since 2024/11/21 + */ +@Getter +@Setter +public class InstancePageQuery extends PowerPageQuery { + + private Long instanceIdEq; + private Long instanceIdLt; + private Long instanceIdGt; + + private Long jobIdEq; + + private List statusIn; + + + private Date gmtCreateLt; + private Date gmtCreateGt; + + private Date gmtModifiedLt; + private Date gmtModifiedGt; +} diff --git a/powerjob-common/src/main/java/tech/powerjob/common/request/query/PowerPageQuery.java b/powerjob-common/src/main/java/tech/powerjob/common/request/query/PowerPageQuery.java new file mode 100644 index 00000000..cd65139b --- /dev/null +++ b/powerjob-common/src/main/java/tech/powerjob/common/request/query/PowerPageQuery.java @@ -0,0 +1,41 @@ +package tech.powerjob.common.request.query; + +import lombok.Getter; +import lombok.Setter; +import tech.powerjob.common.PowerQuery; + +import java.io.Serializable; + +/** + * 分页查询 + * + * @author tjq + * @since 2024/11/21 + */ +@Getter +@Setter +public class PowerPageQuery extends PowerQuery implements Serializable { + + + /* ****************** 分页参数 ****************** */ + /** + * 当前页码 + */ + protected Integer index = 0; + /** + * 页大小 + */ + protected Integer pageSize = 10; + + /* ****************** 排序参数 ****************** */ + + /** + * 排序参数,如 gmtCreate、instanceId + */ + protected String sortBy; + + /** + * asc是指定列按升序排列,desc则是指定列按降序排列 + */ + protected boolean asc = false; +} diff --git a/powerjob-common/src/main/java/tech/powerjob/common/response/PageResult.java b/powerjob-common/src/main/java/tech/powerjob/common/response/PageResult.java new file mode 100644 index 00000000..a90c5ee5 --- /dev/null +++ b/powerjob-common/src/main/java/tech/powerjob/common/response/PageResult.java @@ -0,0 +1,42 @@ +package tech.powerjob.common.response; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * 分页对象 + * + * @author tjq + * @since 2020/4/12 + */ +@Data +@NoArgsConstructor +@Accessors(chain = true) +public class PageResult implements Serializable { + + /** + * 当前页数 + */ + private int index; + /** + * 页大小 + */ + private int pageSize; + /** + * 总页数 + */ + private int totalPages; + /** + * 总数据量 + */ + private long totalItems; + /** + * 数据 + */ + private List data; + +} diff --git a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/instance/InstanceService.java b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/instance/InstanceService.java index 2f09a052..d9a8ed24 100644 --- a/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/instance/InstanceService.java +++ b/powerjob-server/powerjob-server-core/src/main/java/tech/powerjob/server/core/instance/InstanceService.java @@ -3,8 +3,10 @@ package tech.powerjob.server.core.instance; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; -import tech.powerjob.common.PowerQuery; import tech.powerjob.common.RemoteConstant; import tech.powerjob.common.SystemInstanceResult; import tech.powerjob.common.enums.InstanceStatus; @@ -12,8 +14,10 @@ import tech.powerjob.common.exception.PowerJobException; import tech.powerjob.common.model.InstanceDetail; import tech.powerjob.common.request.ServerQueryInstanceStatusReq; import tech.powerjob.common.request.ServerStopInstanceReq; +import tech.powerjob.common.request.query.InstancePageQuery; import tech.powerjob.common.response.AskResponse; import tech.powerjob.common.response.InstanceInfoDTO; +import tech.powerjob.common.response.PageResult; import tech.powerjob.remote.framework.base.URL; import tech.powerjob.server.common.constants.InstanceType; import tech.powerjob.server.common.module.WorkerInfo; @@ -27,8 +31,8 @@ import tech.powerjob.server.persistence.remote.model.JobInfoDO; import tech.powerjob.server.persistence.remote.repository.InstanceInfoRepository; import tech.powerjob.server.persistence.remote.repository.JobInfoRepository; import tech.powerjob.server.remote.server.redirector.DesignateServer; -import tech.powerjob.server.remote.transporter.impl.ServerURLFactory; import tech.powerjob.server.remote.transporter.TransportService; +import tech.powerjob.server.remote.transporter.impl.ServerURLFactory; import tech.powerjob.server.remote.worker.WorkerClusterQueryService; import java.util.Date; @@ -228,12 +232,21 @@ public class InstanceService { } } - public List queryInstanceInfo(PowerQuery powerQuery) { - return instanceInfoRepository - .findAll(QueryConvertUtils.toSpecification(powerQuery)) - .stream() - .map(InstanceService::directConvert) - .collect(Collectors.toList()); + public PageResult queryInstanceInfo(InstancePageQuery instancePageQuery) { + Specification specification = QueryConvertUtils.toSpecification(instancePageQuery); + Pageable pageable = QueryConvertUtils.toPageable(instancePageQuery); + Page instanceInfoDOPage = instanceInfoRepository.findAll(specification, pageable); + + PageResult ret = new PageResult<>(); + List instanceInfoDTOList = instanceInfoDOPage.get().map(InstanceService::directConvert).collect(Collectors.toList()); + + ret.setData(instanceInfoDTOList) + .setIndex(instanceInfoDOPage.getNumber()) + .setPageSize(instanceInfoDOPage.getSize()) + .setTotalPages(instanceInfoDOPage.getTotalPages()) + .setTotalItems(instanceInfoDOPage.getTotalElements()); + + return ret; } /** diff --git a/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/QueryConvertUtils.java b/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/QueryConvertUtils.java index 3f4fe41d..ce62c4f3 100644 --- a/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/QueryConvertUtils.java +++ b/powerjob-server/powerjob-server-persistence/src/main/java/tech/powerjob/server/persistence/QueryConvertUtils.java @@ -1,14 +1,18 @@ package tech.powerjob.server.persistence; import com.alibaba.fastjson.JSONArray; -import tech.powerjob.common.exception.PowerJobException; -import tech.powerjob.common.PowerQuery; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; +import tech.powerjob.common.PowerQuery; +import tech.powerjob.common.exception.PowerJobException; +import tech.powerjob.common.request.query.PowerPageQuery; -import javax.persistence.criteria.*; +import javax.persistence.criteria.Predicate; import java.lang.reflect.Field; import java.util.List; @@ -86,6 +90,26 @@ public class QueryConvertUtils { }; } + public static Pageable toPageable(PowerPageQuery powerPageQuery) { + + Sort sorter = null; + String sortBy = powerPageQuery.getSortBy(); + if (StringUtils.isNoneEmpty(sortBy)) { + sorter = Sort.by(sortBy); + if (powerPageQuery.isAsc()) { + sorter.ascending(); + } else { + sorter.descending(); + } + } + + if (sorter == null) { + return PageRequest.of(powerPageQuery.getIndex(), powerPageQuery.getPageSize()); + } + + return PageRequest.of(powerPageQuery.getIndex(), powerPageQuery.getPageSize(), sorter); + } + public static String convertLikeParams(Object o) { String s = (String) o; if (!s.startsWith("%")) { diff --git a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/openapi/OpenAPIController.java b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/openapi/OpenAPIController.java index 40a9abf3..37e4b2bb 100644 --- a/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/openapi/OpenAPIController.java +++ b/powerjob-server/powerjob-server-starter/src/main/java/tech/powerjob/server/openapi/OpenAPIController.java @@ -7,13 +7,13 @@ import org.springframework.web.bind.annotation.*; import tech.powerjob.client.module.AppAuthRequest; import tech.powerjob.client.module.AppAuthResult; import tech.powerjob.common.OpenAPIConstant; -import tech.powerjob.common.PowerQuery; import tech.powerjob.common.enums.ErrorCodes; import tech.powerjob.common.enums.InstanceStatus; import tech.powerjob.common.exception.PowerJobException; import tech.powerjob.common.request.http.SaveJobInfoRequest; import tech.powerjob.common.request.http.SaveWorkflowNodeRequest; import tech.powerjob.common.request.http.SaveWorkflowRequest; +import tech.powerjob.common.request.query.InstancePageQuery; import tech.powerjob.common.request.query.JobInfoQuery; import tech.powerjob.common.response.*; import tech.powerjob.server.core.instance.InstanceService; @@ -183,7 +183,7 @@ public class OpenAPIController { } @PostMapping(OpenAPIConstant.QUERY_INSTANCE) - public ResultDTO> queryInstance(@RequestBody PowerQuery powerQuery) { + public ResultDTO> queryInstance(@RequestBody InstancePageQuery powerQuery) { return ResultDTO.success(instanceService.queryInstanceInfo(powerQuery)); }