package com.ecep.contract; import com.fasterxml.jackson.core.JsonProcessingException; import java.util.Locale; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.logging.Level; /** * WebSocket客户端任务接口 * 定义了所有通过WebSocket与服务器通信的任务的通用方法 * 包括任务名称、更新消息、更新标题、更新进度等操作 *
* 所有通过WebSocket与服务器通信的任务类都应实现此接口, 文档参考 .trace/rules/client_task_rules.md */ public interface WebSocketClientTasker { /** * s * 获取任务名称 * 任务名称用于唯一标识任务, 服务器端会根据任务名称来调用对应的任务处理函数 * * @return 任务名称 */ String getTaskName(); /** * 更新任务执行过程中的消息 * 客户端可以通过此方法向用户展示任务执行过程中的重要信息或错误提示 * * @param level 消息级别, 用于区分不同类型的消息, 如INFO, WARNING, SEVERE等 * @param message 消息内容, 可以是任意字符串, 用于展示给用户 */ void updateMessage(Level level, String message); /** * 更新任务标题 * 客户端可以通过此方法向用户展示任务的当前执行状态或重要信息 * * @param title 任务标题 */ void updateTitle(String title); /** * 更新任务进度 * 客户端可以通过此方法向用户展示任务的执行进度, 如文件上传进度、数据库操作进度等 * * @param current 当前进度 * @param total 总进度 */ void updateProgress(long current, long total); /** * 取消任务执行 * 默认实现为空,可由具体任务重写以提供取消逻辑 */ default void cancelTask() { // 默认实现为空,由具体任务重写 // 需要获取到 session // 发送 cancel 指令 // 关闭 session.close() } /** * 调用远程WebSocket任务 * 客户端可以通过此方法向服务器提交任务, 并等待服务器返回任务执行结果 * * @param holder 消息持有者,用于记录任务执行过程中的消息 * @param locale 语言环境 * @param args 任务参数 * @return 任务执行结果 */ default Object callRemoteTask(MessageHolder holder, Locale locale, Object... args) { WebSocketClientService webSocketService = SpringApp.getBean(WebSocketClientService.class); // 检查WebSocket连接是否可用 if (!webSocketService.getOnlineProperty().get()) { String errorMsg = "WebSocket连接不可用,请检查网络连接或服务器状态"; holder.addMessage(Level.SEVERE, errorMsg); return null; } WebSocketClientSession session = webSocketService.createSession(); try { session.submitTask(this, locale, args); holder.info("已提交任务到服务器: " + getTaskName()); } catch (JsonProcessingException e) { String errorMsg = "任务提交失败: " + e.getMessage(); holder.warn(errorMsg); throw new RuntimeException("任务提交失败: " + e.getMessage(), e); } // while (!session.isDone()) { // // 使用TimeUnit // try { // TimeUnit.SECONDS.sleep(1); // } catch (InterruptedException e) { // Thread.currentThread().interrupt(); // } // } return null; } /** * 异步调用远程WebSocket任务 * * @param holder 消息持有者,用于记录任务执行过程中的消息 * @param locale 语言环境 * @param args 任务参数 * @return 包含任务执行结果的CompletableFuture */ default CompletableFuture