goupan
2024-04-03 5506e9a45e717ffcb67ec313b5a4e8206d9b3a39
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package cn.stylefeng.roses.kernel.timer.modular.migration;
 
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.stylefeng.roses.kernel.migration.api.AccessMigrationApi;
import cn.stylefeng.roses.kernel.migration.api.enums.MigrationAggregationTypeEnum;
import cn.stylefeng.roses.kernel.migration.api.pojo.MigrationInfo;
import cn.stylefeng.roses.kernel.timer.api.enums.TimerJobStatusEnum;
import cn.stylefeng.roses.kernel.timer.modular.entity.SysTimers;
import cn.stylefeng.roses.kernel.timer.modular.migration.pojo.TimerMigrationInfo;
import cn.stylefeng.roses.kernel.timer.modular.migration.pojo.v1.SysTimersMigration;
import cn.stylefeng.roses.kernel.timer.modular.param.SysTimersParam;
import cn.stylefeng.roses.kernel.timer.modular.service.SysTimersService;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.stereotype.Component;
 
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
 
/**
 * 定时任务迁移接入实现
 *
 * @author majianguo
 * @date 2021/7/8 9:24
 */
@Component
public class TimerMigrationImpl implements AccessMigrationApi {
 
    @Resource
    private SysTimersService sysTimersService;
 
    @Override
    public String getAppName() {
        return "系统应用";
    }
 
    @Override
    public String getModuleName() {
        return "定时任务";
    }
 
    @Override
    public MigrationInfo exportData() {
        MigrationInfo migrationInfo = new MigrationInfo();
        migrationInfo.setVersion("v1");
 
        // 聚合对象
        TimerMigrationInfo timerMigrationInfo = new TimerMigrationInfo();
        migrationInfo.setData(timerMigrationInfo);
 
        // 填充数据
        List<SysTimers> sysTimers = sysTimersService.list();
        List<SysTimersMigration> sysTimersMigrations;
        if (ObjectUtil.isNotEmpty(sysTimers)) {
            sysTimersMigrations = sysTimers.stream().map(item -> BeanUtil.toBean(item, SysTimersMigration.class)).collect(Collectors.toList());
        } else {
            sysTimersMigrations = new ArrayList<>();
        }
        timerMigrationInfo.setSysTimersMigrationList(sysTimersMigrations);
 
        return migrationInfo;
    }
 
    @Override
    public boolean importData(String type, MigrationInfo data) {
        TimerMigrationInfo timerMigrationInfo = JSONObject.toJavaObject((JSONObject) data.getData(), TimerMigrationInfo.class);
 
        if (MigrationAggregationTypeEnum.MIGRATION_INCREMENTAL.getCode().equals(type)) {
            // 查询配置信息
            List<SysTimersMigration> sysTimersMigrationList = timerMigrationInfo.getSysTimersMigrationList();
            if (ObjectUtil.isNotEmpty(sysTimersMigrationList)) {
                Set<Long> ids = sysTimersMigrationList.stream().map(SysTimersMigration::getTimerId).collect(Collectors.toSet());
 
                // 组装查询条件
                LambdaQueryWrapper<SysTimers> lambdaQueryWrapper = new LambdaQueryWrapper<>();
                lambdaQueryWrapper.select(SysTimers::getTimerId);
                lambdaQueryWrapper.in(SysTimers::getTimerId, ids);
                List<SysTimers> dbList = sysTimersService.list(lambdaQueryWrapper);
 
                // 移除已存在项
                for (SysTimers db : dbList) {
                    sysTimersMigrationList.removeIf(item -> item.getTimerId().equals(db.getTimerId()));
                }
            }
        }
 
        // 入库
        List<SysTimersMigration> sysTimersMigrationList = timerMigrationInfo.getSysTimersMigrationList();
        if (ObjectUtil.isNotEmpty(sysTimersMigrationList)) {
            List<SysTimers> sysTimers = sysTimersMigrationList.stream().map(item -> BeanUtil.toBean(item, SysTimers.class)).collect(Collectors.toList());
            sysTimersService.saveOrUpdateBatch(sysTimers);
 
            // 启动任务
            for (SysTimers sysTimer : sysTimers) {
                SysTimersParam sysTimersParam = BeanUtil.toBean(sysTimer, SysTimersParam.class);
                if (TimerJobStatusEnum.RUNNING.getCode().equals(sysTimer.getJobStatus())) {
                    sysTimersService.start(sysTimersParam);
                } else {
                    sysTimersService.stop(sysTimersParam);
                }
            }
        }
        return true;
    }
}