删除1周前无用的im task数据

This commit is contained in:
yanglin 2024-05-09 13:58:37 +08:00
parent 55b6e7896e
commit e64edeb0c0
7 changed files with 245 additions and 1 deletions

View File

@ -21,6 +21,10 @@
</properties> </properties>
<dependencies> <dependencies>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
<dependency> <dependency>
<groupId>com.xuxueli</groupId> <groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId> <artifactId>xxl-job-core</artifactId>

View File

@ -2,8 +2,16 @@ package cn.axzo.im.dao.mapper;
import cn.axzo.im.entity.MessageTask; import cn.axzo.im.entity.MessageTask;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.Date;
@Repository @Repository
public interface MessageTaskMapper extends BaseMapper<MessageTask> { public interface MessageTaskMapper extends BaseMapper<MessageTask> {
}
@Delete("DELETE FROM im_message_task WHERE create_at <= #{until} and status = 'SUCCEED'" )
int expunge(@Param("until") Date until);
}

View File

@ -0,0 +1,52 @@
package cn.axzo.im.job;
import cn.axzo.im.dao.mapper.MessageTaskMapper;
import cn.axzo.im.utils.JSONObjectUtil;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* @author yanglin
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class ExpungeImTaskJob extends IJobHandler {
private final MessageTaskMapper messageTaskMapper;
@Override
@XxlJob("expungeImTaskJob")
public ReturnT<String> execute(String paramStr) {
log.info("start - run job with param={}", paramStr);
try {
Param param = JSONObjectUtil.parseObject(paramStr, Param.class);
executeImpl(param);
log.info("end - run job with param={}", param);
return ReturnT.SUCCESS;
} catch (Exception e) {
log.warn("job failed. param={}", paramStr, e);
return ReturnT.FAIL;
}
}
private void executeImpl(Param param) {
Date until = DateTime.now().minusDays(param.daysAgo).toDate();
int count = messageTaskMapper.expunge(until);
log.info("deleted count={}", count);
}
@Data
public static class Param {
private int daysAgo = 7;
}
}

View File

@ -0,0 +1,51 @@
package cn.axzo.im.utils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.Date;
import java.util.Objects;
import java.util.Optional;
/**
* @description
* 日期格式转换工具类
*
* @author cold_blade
* @date 2023/9/28
* @version 1.0
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class DateFormatUtil {
public static String toReadableString(Date date) {
if (date == null)
return null;
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
}
public static LocalDateTime toLocalDateTime(Date date) {
if (Objects.isNull(date)) {
return null;
}
ZoneId zoneId = ZoneId.systemDefault();
return date.toInstant().atZone(zoneId).toLocalDateTime();
}
public static Long toTimestamp(LocalDateTime dateTime) {
return Optional.ofNullable(dateTime)
.map(v -> v.atZone(ZoneOffset.systemDefault()).toInstant().toEpochMilli())
.orElse(null);
}
public static Date toDate(LocalDateTime dateTime) {
return Optional.ofNullable(dateTime)
.map(v -> toTimestamp(dateTime))
.map(Date::new)
.orElse(null);
}
}

View File

@ -0,0 +1,87 @@
package cn.axzo.im.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
/**
* @author cold_blade
* @date 2023/10/13
* @version 1.0
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class JSONObjectUtil {
private static final String EMPTY_JSON_OBJ_STR = "{}";
private static final String EMPTY_JSON_ARR_STR = "[]";
/**
* 解析JSON字符串若字符串格式不正确抛异常
*
* @param str 待解析的字符串
* @return JSONObject
*/
public static JSONObject parseObject(String str) {
if (StringUtils.isBlank(str)) {
return new JSONObject();
}
return JSON.parseObject(str);
}
/**
* 解析JSON字符串若字符串格式不正确抛异常
*
* @param str 待解析的字符串
* @return JSONObject
*/
public static <T> T parseObject(String str, Class<T> type) {
if (StringUtils.isBlank(str)) {
return ReflectionUtils.newInstance(type);
}
return JSON.parseObject(str, type);
}
/**
* 解析JSON字符串若字符串格式不正确抛异常
*
* @param str 待解析的字符串
* @return List<T>
*/
public static <T> List<T> parseArray(String str, Class<T> clazz) {
if (StringUtils.isBlank(str)) {
return Collections.emptyList();
}
return JSON.parseArray(str, clazz);
}
public static String toJSONString(Object obj) {
if (Objects.isNull(obj)) {
return EMPTY_JSON_OBJ_STR;
}
return JSON.toJSONString(obj);
}
public static String toJSONString(Collection<?> objCollection) {
if (CollectionUtils.isEmpty(objCollection)) {
return EMPTY_JSON_ARR_STR;
}
return JSON.toJSONString(objCollection);
}
/**
* 校验字符串是否为有效的JSON字符串若字符串格式不正确抛异常
*
* @param str 待校验的字符串
* @return 原字符串OR空的JSONObject
*/
public static String checkAndReturn(String str) {
return parseObject(str).toJSONString();
}
}

View File

@ -0,0 +1,19 @@
package cn.axzo.im.utils;
import cn.axzo.basics.common.exception.ServiceException;
/**
* @author: wangli
* @date: 2022/3/26 14:29
*/
public final class ReflectionUtils {
public static <T> T newInstance(Class<T> type) {
try {
return type.newInstance();
} catch (Exception e) {
throw new ServiceException(String.format("初始化失败. type=%s", type.getName()), e);
}
}
}

View File

@ -0,0 +1,23 @@
package cn.axzo.im.job;
import cn.axzo.im.Application;
import lombok.RequiredArgsConstructor;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @author yanglin
*/
@SpringBootTest(classes = Application.class)
@RequiredArgsConstructor(onConstructor_ = @Autowired)
class ExpungeImTaskJobTest {
private final ExpungeImTaskJob expungeImTaskJob;
@Test
void foo() {
expungeImTaskJob.execute(null);
}
}