AppStartupRunner.java
4.92 KB
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
package com.xly.runner;
import com.xly.entity.SceneDto;
import com.xly.entity.ToolMeta;
import com.xly.entity.ParamRule;
import com.xly.mapper.SceneMapper;
import com.xly.mapper.ParamRuleMapper;
import com.xly.mapper.ToolMetaMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Component
@Order(100)
public class AppStartupRunner implements CommandLineRunner {
// 静态缓存列表
private static final List<SceneDto> AI_AGENT_CACHE = new ArrayList<>();
private static final List<ToolMeta> AI_TOOL_CACHE = new ArrayList<>();
private static final List<ParamRule> AI_TOOL_PARAMS_CACHE = new ArrayList<>();
// 使用实例变量进行依赖注入
@Autowired
private SceneMapper sceneMapper;
@Autowired
private ParamRuleMapper paramRuleMapper;
@Autowired
private ToolMetaMapper toolMetaMapper;
public void cleanAllInit(){
AI_AGENT_CACHE.clear();
AI_TOOL_CACHE.clear();
AI_TOOL_PARAMS_CACHE.clear();
//初始化
initCache();
}
@Override
public void run(String... args) throws Exception {
log.info("应用启动完成,开始初始化...");
// 初始化缓存
initCache();
// 打印缓存信息
printCacheInfo();
log.info("应用初始化完成");
}
/**
* 配置热点数据加载
*/
private void initCache() {
log.info("开始初始化缓存...");
// 1. 加载AI代理数据
List<SceneDto> sceneDtos = sceneMapper.findAll();
if (sceneDtos != null) {
AI_AGENT_CACHE.clear();
AI_AGENT_CACHE.addAll(sceneDtos);
log.info("加载AI代理数据: {} 条", sceneDtos.size());
} else {
log.warn("AI代理数据为空");
}
// 2. 加载AI工具数据
List<ToolMeta> toolMetas = toolMetaMapper.findAll();
if (toolMetas != null) {
AI_TOOL_CACHE.clear();
AI_TOOL_CACHE.addAll(toolMetas);
log.info("加载AI工具数据: {} 条", toolMetas.size());
} else {
log.warn("AI工具数据为空");
}
// 3. 加载AI工具参数数据
List<ParamRule> toolParams = paramRuleMapper.findAll();
if (toolParams != null) {
AI_TOOL_PARAMS_CACHE.clear();
AI_TOOL_PARAMS_CACHE.addAll(toolParams);
log.info("加载AI工具参数数据: {} 条", toolParams.size());
} else {
log.warn("AI工具参数数据为空");
}
log.info("缓存初始化完成");
}
/**
* 打印缓存信息
*/
private void printCacheInfo() {
log.info("=== 缓存统计 ===");
log.info("AI代理缓存: {} 条", AI_AGENT_CACHE.size());
log.info("AI工具缓存: {} 条", AI_TOOL_CACHE.size());
log.info("AI工具参数缓存: {} 条", AI_TOOL_PARAMS_CACHE.size());
// 打印前几条数据示例
if (!AI_AGENT_CACHE.isEmpty()) {
log.info("AI代理示例: {}", AI_AGENT_CACHE.get(0));
}
if (!AI_TOOL_CACHE.isEmpty()) {
log.info("AI工具示例: {}", AI_TOOL_CACHE.get(0));
}
}
/**
* 静态方法获取缓存(线程安全)
*/
public static List<SceneDto> getAiAgentCache() {
return new ArrayList<>(AI_AGENT_CACHE); // 返回副本,保证线程安全
}
public static List<ToolMeta> getAiToolCache() {
return new ArrayList<>(AI_TOOL_CACHE);
}
public static List<ParamRule> getAiToolParamsCache() {
return new ArrayList<>(AI_TOOL_PARAMS_CACHE);
}
public static List<ToolMeta> getTools(List<String> sModleData) {
List<ToolMeta> rData = AI_TOOL_CACHE.stream()
.filter(agent -> sModleData.contains(agent.getSSrcFormId()))
.collect(Collectors.toList());
rData.sort(Comparator.comparing(h -> h.getIOrder()));
return rData;
}
public static List<ToolMeta> getAllTools() {
return AI_TOOL_CACHE;
}
/**
* 根据ID获取AI代理
*/
public static SceneDto getAiAgentById(String sId) {
return AI_AGENT_CACHE.stream()
.filter(agent -> agent.getSId().equals(sId))
.findFirst()
.orElse(null);
}
/**
* 根据编码获取AI代理
*/
public static SceneDto getAiAgentByCode(String sName) {
return AI_AGENT_CACHE.stream()
.filter(agent -> agent.getSSceneName().equals(sName))
.findFirst()
.orElse(null);
}
/**
* 刷新缓存
*/
public void refreshCache() {
initCache();
}
}