feat: 实现客户端与服务器端Tasker通信机制及文件管理功能
refactor: 重构Tasker基类与服务获取逻辑 fix: 修复文件路径显示问题及任务注册加载机制 docs: 添加客户端与服务器端Tasker通信规则文档 style: 优化代码格式与日志输出 build: 添加tasker_mapper.json配置文件 chore: 清理无用代码与文件
This commit is contained in:
@@ -1,25 +1,27 @@
|
||||
package com.ecep.contract.service;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.core.io.ResourceLoader;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.socket.TextMessage;
|
||||
import org.springframework.web.socket.WebSocketSession;
|
||||
|
||||
import com.ecep.contract.Message;
|
||||
import com.ecep.contract.constant.WebSocketConstant;
|
||||
import com.ecep.contract.ui.Tasker;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.socket.TextMessage;
|
||||
import org.springframework.web.socket.WebSocketSession;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
|
||||
@Service
|
||||
public class WebSocketServerTaskManager implements InitializingBean {
|
||||
@@ -28,16 +30,31 @@ public class WebSocketServerTaskManager implements InitializingBean {
|
||||
private ObjectMapper objectMapper;
|
||||
@Autowired
|
||||
private ScheduledExecutorService scheduledExecutorService;
|
||||
@Autowired
|
||||
private ResourceLoader resourceLoader;
|
||||
private Map<String, String> taskClzMap = Map.of();
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
taskClzMap = Map.of(
|
||||
"ContractSyncTask", "com.ecep.contract.cloud.u8.ContractSyncTask",
|
||||
"ContractRepairTask", "com.ecep.contract.ds.contract.tasker.ContractRepairTask",
|
||||
"ContractVerifyTask", "com.ecep.contract.ds.contract.tasker.ContractVerifyTask",
|
||||
"ProjectCostImportItemsFromContractsTasker", "com.ecep.contract.ds.project.ProjectCostImportItemsFromContractsTasker"
|
||||
);
|
||||
// 从tasker_mapper.json文件中加载任务注册信息
|
||||
try {
|
||||
Resource resource = resourceLoader.getResource("classpath:tasker_mapper.json");
|
||||
try (InputStream inputStream = resource.getInputStream()) {
|
||||
JsonNode rootNode = objectMapper.readTree(inputStream);
|
||||
JsonNode taskersNode = rootNode.get("taskers");
|
||||
if (taskersNode != null && taskersNode.isObject()) {
|
||||
Map<String, String> taskMap = new java.util.HashMap<>();
|
||||
taskersNode.fields().forEachRemaining(entry -> {
|
||||
taskMap.put(entry.getKey(), entry.getValue().asText());
|
||||
});
|
||||
taskClzMap = taskMap;
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error("Failed to load tasker_mapper.json", e);
|
||||
// 使用默认值作为fallback
|
||||
taskClzMap = Map.of();
|
||||
}
|
||||
}
|
||||
|
||||
public void onMessage(WebSocketSession session, JsonNode jsonNode) {
|
||||
@@ -51,7 +68,6 @@ public class WebSocketServerTaskManager implements InitializingBean {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void handleAsSessionCallback(WebSocketSession session, String sessionId, JsonNode jsonNode) {
|
||||
if (!jsonNode.has("type")) {
|
||||
throw new IllegalArgumentException("缺失 type 参数");
|
||||
@@ -120,8 +136,7 @@ public class WebSocketServerTaskManager implements InitializingBean {
|
||||
String text = objectMapper.writeValueAsString(Map.of(
|
||||
WebSocketConstant.SESSION_ID_FIELD_NAME, sessionId,
|
||||
"type", type,
|
||||
WebSocketConstant.ARGUMENTS_FIELD_NAME, args
|
||||
));
|
||||
WebSocketConstant.ARGUMENTS_FIELD_NAME, args));
|
||||
session.sendMessage(new TextMessage(text));
|
||||
} catch (IOException e) {
|
||||
// 捕获所有可能的异常,防止影响主流程
|
||||
@@ -130,7 +145,6 @@ public class WebSocketServerTaskManager implements InitializingBean {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
private void sendError(WebSocketSession session, String sessionId, String message) {
|
||||
if (session == null || !session.isOpen()) {
|
||||
logger.warn("尝试向已关闭的WebSocket会话发送错误消息: {}", message);
|
||||
@@ -141,8 +155,7 @@ public class WebSocketServerTaskManager implements InitializingBean {
|
||||
String errorMessage = objectMapper.writeValueAsString(Map.of(
|
||||
WebSocketConstant.SESSION_ID_FIELD_NAME, sessionId,
|
||||
WebSocketConstant.SUCCESS_FIELD_VALUE, false,
|
||||
WebSocketConstant.MESSAGE_FIELD_NAME, message
|
||||
));
|
||||
WebSocketConstant.MESSAGE_FIELD_NAME, message));
|
||||
|
||||
// 检查会话状态并尝试发送错误消息
|
||||
if (session.isOpen()) {
|
||||
|
||||
Reference in New Issue
Block a user