Skip to content

Commit

Permalink
feat($Quartz): support batch import
Browse files Browse the repository at this point in the history
  • Loading branch information
johnnymillergh committed Sep 27, 2021
1 parent b7ee607 commit ab23e03
Show file tree
Hide file tree
Showing 7 changed files with 219 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.jmsoftware.maf.springcloudstarter.function;

import cn.hutool.core.util.BooleanUtil;

import java.util.function.Consumer;
import java.util.function.Supplier;

import static java.util.Objects.nonNull;

/**
* Description: BooleanCheckUtil, change description here.
*
* @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/27/2021 12:03 PM
**/
public class BooleanCheckUtil {
/**
* Require true or else throw exception.
*
* @param aBoolean the aBoolean
* @param after the after
* @return the throw exception function
*/
public static ThrowExceptionFunction requireTrue(Boolean aBoolean, Consumer<Boolean> after) {
if (nonNull(after)) {
after.accept(aBoolean);
}
return exceptionSupplier -> {
if (BooleanUtil.isFalse(aBoolean)) {
throw exceptionSupplier.get();
}
};
}

@FunctionalInterface
public interface ThrowExceptionFunction {
/**
* Or else throw.
*
* @param exceptionSupplier the exception supplier
* @throws Throwable the throwable
*/
void orElseThrow(Supplier<? extends Throwable> exceptionSupplier) throws Throwable;
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,23 @@
package com.jmsoftware.maf.springcloudstarter.quartz.controller;

import com.jmsoftware.maf.common.bean.PageResponseBodyBean;
import com.jmsoftware.maf.springcloudstarter.poi.AbstractExcelDataController;
import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListItem;
import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListPayload;
import com.jmsoftware.maf.springcloudstarter.quartz.entity.QuartzJobConfigurationExcel;
import com.jmsoftware.maf.springcloudstarter.quartz.service.QuartzJobConfigurationService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.time.Instant;
import java.util.List;

/**
* <h1>QuartzJobConfigurationController</h1>
Expand All @@ -20,11 +26,13 @@
*
* @author Johnny Miller (鍾俊), email: johnnysviva@outlook.com, 9/26/21 11:58 PM
**/
@Slf4j
@Validated
@RestController
@RequiredArgsConstructor
@RequestMapping("/quartz-job")
@Api(tags = {"Quartz Job Configuration API"})
public class QuartzJobConfigurationController {
public class QuartzJobConfigurationController extends AbstractExcelDataController<QuartzJobConfigurationExcel> {
private final QuartzJobConfigurationService service;

@GetMapping("/quartz-job-configurations")
Expand All @@ -34,4 +42,32 @@ public PageResponseBodyBean<GetQuartzJobConfigurationPageListItem> getPageList(
) {
return this.service.getPageList(payload);
}

@Override
protected void onExceptionOccurred() {
log.error("Exception occurred when uploading excel. Excel class: {}", QuartzJobConfigurationExcel.class);
this.fileName.set(String.format("quartz-job-configuration-stat-%s.xlsx", Instant.now()));
}

@Override
protected void validateBeforeAddToBeanList(List<QuartzJobConfigurationExcel> beanList,
QuartzJobConfigurationExcel bean, int index)
throws IllegalArgumentException {
this.service.validateBeforeAddToBeanList(beanList, bean, index);
}

@Override
protected void executeDatabaseOperation(List<QuartzJobConfigurationExcel> beanList) {
this.service.save(beanList);
}

@Override
protected String getTemplateFileName() {
return QuartzJobConfigurationService.TEMPLATE_EXCEL;
}

@Override
protected List<QuartzJobConfigurationExcel> getListForExporting() {
return this.service.getListForExporting();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.jmsoftware.maf.springcloudstarter.quartz.entity;

import lombok.Data;

import javax.validation.constraints.NotBlank;
import java.time.LocalDateTime;

/**
* Description: QuartzJobConfigurationExcel, change description here.
*
* @author Johnny Miller (锺俊), email: johnnysviva@outlook.com, date: 9/27/2021 11:26 AM
**/
@Data
public class QuartzJobConfigurationExcel {
@NotBlank
private String name;
private String group;
private String serviceName;
@NotBlank
private String invokeTarget;
@NotBlank
private String cronExpression;
private Byte misfirePolicy;
private Byte concurrent;
@NotBlank
private String description;
private Byte status;
private String createdBy;
private LocalDateTime createdTime;
private String modifiedBy;
private LocalDateTime modifiedTime;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListItem;
import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListPayload;
import com.jmsoftware.maf.springcloudstarter.quartz.entity.QuartzJobConfigurationExcel;
import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
* Description: QuartzJobConfigurationMapper
*
Expand All @@ -26,4 +29,12 @@ Page<GetQuartzJobConfigurationPageListItem> selectPageList(
Page<GetQuartzJobConfigurationPageListItem> page,
@Param("payload") GetQuartzJobConfigurationPageListPayload payload
);

/**
* Select list for exporting list.
*
* @param serviceName the service name
* @return the list
*/
List<QuartzJobConfigurationExcel> selectListForExporting(String serviceName);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@
import com.jmsoftware.maf.common.bean.PageResponseBodyBean;
import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListItem;
import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListPayload;
import com.jmsoftware.maf.springcloudstarter.quartz.entity.QuartzJobConfigurationExcel;
import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration;
import org.springframework.validation.annotation.Validated;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import java.util.List;

/**
* Description: QuartzJobConfigurationService
Expand All @@ -16,6 +19,8 @@
*/
@Validated
public interface QuartzJobConfigurationService extends IService<QuartzJobConfiguration> {
String TEMPLATE_EXCEL = "quartz-job-configuration-stat.xlsx";

/**
* Gets page list.
*
Expand All @@ -25,4 +30,28 @@ public interface QuartzJobConfigurationService extends IService<QuartzJobConfigu
PageResponseBodyBean<GetQuartzJobConfigurationPageListItem> getPageList(
@Valid GetQuartzJobConfigurationPageListPayload payload
);

/**
* Validate before add to bean list.
*
* @param beanList the bean list
* @param bean the bean
* @param index the index
*/
void validateBeforeAddToBeanList(List<QuartzJobConfigurationExcel> beanList, QuartzJobConfigurationExcel bean,
int index);

/**
* Save.
*
* @param beanList the bean list
*/
void save(@NotEmpty List<@Valid QuartzJobConfigurationExcel> beanList);

/**
* Gets list for exporting.
*
* @return the list for exporting
*/
List<QuartzJobConfigurationExcel> getListForExporting();
}
Original file line number Diff line number Diff line change
@@ -1,27 +1,36 @@
package com.jmsoftware.maf.springcloudstarter.quartz.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.extra.validation.ValidationUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jmsoftware.maf.common.bean.PageResponseBodyBean;
import com.jmsoftware.maf.springcloudstarter.configuration.MafProjectProperty;
import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListItem;
import com.jmsoftware.maf.springcloudstarter.quartz.entity.GetQuartzJobConfigurationPageListPayload;
import com.jmsoftware.maf.springcloudstarter.quartz.entity.QuartzJobConfigurationExcel;
import com.jmsoftware.maf.springcloudstarter.quartz.entity.persistence.QuartzJobConfiguration;
import com.jmsoftware.maf.springcloudstarter.quartz.mapper.QuartzJobConfigurationMapper;
import com.jmsoftware.maf.springcloudstarter.quartz.service.QuartzJobConfigurationService;
import com.jmsoftware.maf.springcloudstarter.quartz.util.ScheduleUtil;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.quartz.SchedulerException;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.PostConstruct;
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import static com.jmsoftware.maf.springcloudstarter.function.BooleanCheckUtil.requireTrue;

/**
* Description: QuartzJobConfigurationServiceImpl
Expand Down Expand Up @@ -66,4 +75,37 @@ public PageResponseBodyBean<GetQuartzJobConfigurationPageListItem> getPageList(
this.getBaseMapper().selectPageList(page, payload);
return PageResponseBodyBean.ofSuccess(page.getRecords(), page.getTotal());
}

@Override
@SneakyThrows
public void validateBeforeAddToBeanList(List<QuartzJobConfigurationExcel> beanList,
QuartzJobConfigurationExcel bean, int index) {
val beanValidationResult = ValidationUtil.warpValidate(bean);
requireTrue(
beanValidationResult.isSuccess(),
success -> log.info("QuartzJobConfigurationExcel validation result: {}", success)
).orElseThrow(
() -> new IllegalStateException("Invalid data. " + beanValidationResult.getErrorMessages().get(0))
);
}

@Override
@SneakyThrows
@Transactional(rollbackFor = Throwable.class)
public void save(@NotEmpty List<@Valid QuartzJobConfigurationExcel> beanList) {
val quartzJobConfigurationList = beanList.stream().map(quartzJobConfigurationExcel -> {
val quartzJobConfiguration = new QuartzJobConfiguration();
BeanUtil.copyProperties(quartzJobConfigurationExcel, quartzJobConfiguration);
return quartzJobConfiguration;
}).collect(Collectors.toList());
requireTrue(
this.saveBatch(quartzJobConfigurationList),
saved -> log.info("Saved quartzJobConfigurationList, saved: {}", saved)
).orElseThrow(() -> new IllegalStateException("Failed to save batch quartzJobConfigurationList"));
}

@Override
public List<QuartzJobConfigurationExcel> getListForExporting() {
return this.getBaseMapper().selectListForExporting(this.mafProjectProperty.getProjectArtifactId());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,31 @@
<where>
qjc.deleted = 0
<if test="@cn.hutool.core.util.StrUtil@isNotBlank(payload.serviceName)">
AND qjc.service_name LIKE concat('%', #{payload.serviceName}, '%')
AND qjc.service_name LIKE CONCAT('%', #{payload.serviceName}, '%')
</if>
</where>
</select>

<select id="selectListForExporting"
resultType="com.jmsoftware.maf.springcloudstarter.quartz.entity.QuartzJobConfigurationExcel">
SELECT qjc.id AS id,
qjc.name AS name,
qjc.`group` AS `group`,
qjc.service_name AS serviceName,
qjc.invoke_target AS invokeTarget,
qjc.cron_expression AS cronExpression,
qjc.misfire_policy AS misfirePolicy,
qjc.concurrent AS concurrent,
qjc.description AS description,
qjc.status AS status,
createdBy.username AS createdBy,
qjc.created_time AS createdTime,
modifiedBy.username AS modifiedBy,
qjc.modified_time AS modified_time
FROM quartz_job_configuration qjc
LEFT JOIN user createdBy ON createdBy.id = qjc.created_by
LEFT JOIN user modifiedBy ON modifiedBy.id = qjc.modified_by
WHERE qjc.deleted = 0
AND qjc.service_name = #{serviceName}
</select>
</mapper>

0 comments on commit ab23e03

Please sign in to comment.