feat(SMB): 重构SMB文件服务支持多服务器配置和连接池优化

重构SmbFileService以支持多服务器配置,引入连接池和会话池管理机制。主要变更包括:
1. 实现基于主机的多服务器认证配置
2. 新增连接池和会话池管理,提高连接复用率
3. 添加定时清理空闲连接和会话的功能
4. 优化异常处理和重试机制
5. 改进日志记录和资源释放

同时更新相关配置文件和应用属性以支持新功能:
1. 修改application.properties支持多服务器SMB配置
2. 增强SmbConfig类以管理多服务器配置
3. 添加任务映射到tasker_mapper.json
4. 新增客户端和服务端任务规则文档
This commit is contained in:
2025-11-17 12:55:31 +08:00
parent e761990ebf
commit 87290f15b0
14 changed files with 1367 additions and 156 deletions

View File

@@ -11,10 +11,13 @@ import java.util.logging.Level;
* WebSocket客户端任务接口
* 定义了所有通过WebSocket与服务器通信的任务的通用方法
* 包括任务名称、更新消息、更新标题、更新进度等操作
*
* 所有通过WebSocket与服务器通信的任务类都应实现此接口, 文档参考 .trace/rules/client_task_rules.md
*/
public interface WebSocketClientTasker {
/**
/**s
* 获取任务名称
* 任务名称用于唯一标识任务, 服务器端会根据任务名称来调用对应的任务处理函数
*
* @return 任务名称
*/
@@ -22,14 +25,16 @@ public interface WebSocketClientTasker {
/**
* 更新任务执行过程中的消息
* 客户端可以通过此方法向用户展示任务执行过程中的重要信息或错误提示
*
* @param level 消息级别
* @param message 消息内容
* @param level 消息级别, 用于区分不同类型的消息, 如INFO, WARNING, SEVERE等
* @param message 消息内容, 可以是任意字符串, 用于展示给用户
*/
void updateMessage(Level level, String message);
/**
* 更新任务标题
* 客户端可以通过此方法向用户展示任务的当前执行状态或重要信息
*
* @param title 任务标题
*/
@@ -37,6 +42,7 @@ public interface WebSocketClientTasker {
/**
* 更新任务进度
* 客户端可以通过此方法向用户展示任务的执行进度, 如文件上传进度、数据库操作进度等
*
* @param current 当前进度
* @param total 总进度
@@ -53,6 +59,7 @@ public interface WebSocketClientTasker {
/**
* 调用远程WebSocket任务
* 客户端可以通过此方法向服务器提交任务, 并等待服务器返回任务执行结果
*
* @param holder 消息持有者,用于记录任务执行过程中的消息
* @param locale 语言环境

View File

@@ -1,21 +1,37 @@
package com.ecep.contract.task;
import com.ecep.contract.MessageHolder;
import com.ecep.contract.WebSocketClientTasker;
import com.ecep.contract.service.ContractService;
import com.ecep.contract.vo.ContractGroupVo;
import lombok.extern.slf4j.Slf4j;
import lombok.Setter;
public class ContractFilesRebuildAllTasker extends Tasker<Object>{
@Slf4j
public class ContractFilesRebuildAllTasker extends Tasker<Object> implements WebSocketClientTasker {
@Setter
private ContractService contractService;
@Setter
private ContractGroupVo group;
@Override
public String getTaskName() {
return "ContractFilesRebuildAllTasker";
}
@Override
public void updateProgress(long workDone, long max) {
super.updateProgress(workDone, max);
}
@Override
protected Object execute(MessageHolder holder) throws Exception {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'execute'");
updateTitle("重建合同组 " + group.getName() + " 的所有文件");
log.info("开始重建合同组文件: {}", group.getName());
// 调用远程任务
return callRemoteTask(holder, getLocale(), group.getId());
}
}

View File

@@ -1,14 +1,40 @@
package com.ecep.contract.task;
import com.ecep.contract.MessageHolder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ContractRepairAllTasker extends Tasker<Object>{
import com.ecep.contract.MessageHolder;
import com.ecep.contract.WebSocketClientTasker;
/**
* 合同修复任务类
* 用于通过WebSocket与服务器通信执行合同数据修复操作
*/
public class ContractRepairAllTasker extends Tasker<Object> implements WebSocketClientTasker {
private static final Logger logger = LoggerFactory.getLogger(ContractRepairAllTasker.class);
@Override
public void updateProgress(long current, long total) {
super.updateProgress(current, total);
}
@Override
public void updateTitle(String title) {
// 使用Tasker的updateTitle方法更新标题
super.updateTitle(title);
}
@Override
public String getTaskName() {
return "ContractRepairAllTask";
}
@Override
protected Object execute(MessageHolder holder) throws Exception {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'execute'");
logger.info("开始执行合同修复任务");
updateTitle("合同数据修复");
Object result = callRemoteTask(holder, getLocale());
logger.info("合同修复任务执行完成");
return result;
}
}

View File

@@ -43,7 +43,9 @@ public class ContractRepairTask extends Tasker<Object> implements WebSocketClien
@Override
public void updateProgress(long current, long total) {
super.updateProgress(current, total);
double d = (double) current / total;
super.updateProgress(d, 1);
System.out.println("current = " + d + ", total = " + total);
}
@Override

View File

@@ -209,18 +209,22 @@ public class UITools {
Platform.runLater(() -> {
box.getChildren().add(progressBar);
System.out.println("add progressBar = " + progressBar);
});
// progressBar.disabledProperty().bind(task.runningProperty());
progressBar.visibleProperty().bind(task.runningProperty());
progressBar.progressProperty().bind(task.progressProperty());
task.progressProperty().addListener((observable, oldValue, newValue) -> {
System.out.println("progress = " + newValue);
});
if (task instanceof Tasker<?> tasker) {
// 提交任务
Desktop.instance.getExecutorService().submit(tasker);
}
if (init != null) {
init.accept(msg -> consumer.test(msg));
init.accept(consumer::test);
}
dialog.showAndWait();
if (task.isRunning()) {