WangHan
2024-09-12 d5855a4926926698b740bc6c7ba489de47adb68b
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
package tech.powerjob.official.processors.impl;
 
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import tech.powerjob.common.serialize.JsonUtils;
import tech.powerjob.official.processors.util.CommonUtils;
import tech.powerjob.worker.core.processor.ProcessResult;
import tech.powerjob.worker.core.processor.TaskContext;
import tech.powerjob.worker.core.processor.sdk.BroadcastProcessor;
 
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.Serializable;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.Optional;
 
/**
 * 配置处理器
 * 超简易的配置中心,用于配置的下发,需要配合秒级 + 广播任务使用!
 * 超低成本下的解决方案,强配置 or 高SLA 场景,请使用标准的配置管理中间件。
 * 外部调用方法 {@link ConfigProcessor#fetchConfig()}
 *
 * @author tjq
 * @since 2022/9/17
 */
@Slf4j
public class ConfigProcessor implements BroadcastProcessor {
 
    /**
     * 获取配置
     * @return 控制台下发的配置
     */
    public static Map<String, Object> fetchConfig() {
        if (config == null) {
            return Maps.newHashMap();
        }
        return Optional.ofNullable(config.getConfig()).orElse(Maps.newHashMap());
    }
 
    private static Config config;
 
    @Override
    public ProcessResult process(TaskContext context) throws Exception {
 
        Config newCfg = JsonUtils.parseObject(CommonUtils.parseParams(context), Config.class);
        context.getOmsLogger().info("[ConfigProcessor] receive and update config: {}", config);
 
        // 空场景不更新
        final Map<String, Object> realConfig = newCfg.config;
        if (realConfig == null) {
            return new ProcessResult(false, "CONFIG_IS_NULL");
        }
 
        config = newCfg;
 
        if (StringUtils.isNotEmpty(config.persistentFileName)) {
            final File file = new File(config.persistentFileName);
 
            String content = JSONObject.toJSONString(realConfig);
            FileUtils.copyToFile(new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8)), file);
        }
 
        return new ProcessResult(true, "UPDATE_SUCCESS");
    }
 
    @Data
    public static class Config implements Serializable {
 
        /**
         * 原始配置
         */
        private Map<String, Object> config;
 
        /**
         * 持久到本地的全路径名称
         */
        private String persistentFileName;
    }
}