H5任务调度与执行中心的设计与实现

H5任务调度与执行中心的设计与实现

在Web应用开发中,任务调度与执行是提升用户体验和系统效率的关键环节。本文将详细阐述如何构建一个响应式的H5任务脚本选择与执行中心,从界面设计到核心逻辑实现,为开发者提供完整的解决方案。

一、核心架构设计

1.1 模块化分层结构

系统采用三层架构设计:

  • 表现层:负责用户交互与界面展示
  • 业务逻辑层:处理任务选择、调度与执行
  • 数据层:管理任务配置与执行状态
  1. // 示例:模块化架构实现
  2. const TaskCenter = {
  3. ui: { /* 界面组件 */ },
  4. core: { /* 核心逻辑 */ },
  5. data: { /* 数据管理 */ }
  6. }

1.2 响应式设计原则

系统适配不同设备尺寸,采用以下技术方案:

  • 视口单位:使用vw/vh替代固定像素
  • 媒体查询:针对不同断点设置样式
  • 弹性布局flexbox实现动态排列
  1. /* 响应式容器示例 */
  2. .task-container {
  3. width: 100%;
  4. max-width: 600px;
  5. margin: 0 auto;
  6. padding: 15px;
  7. }
  8. @media (max-width: 480px) {
  9. .task-item {
  10. font-size: 14px;
  11. padding: 10px;
  12. }
  13. }

二、界面组件实现

2.1 导航栏组件

顶部导航栏实现多标签切换功能,核心代码:

  1. <div class="nav-bar">
  2. <button class="nav-item active" data-tab="task-list">任务列表</button>
  3. <button class="nav-item" data-tab="running">执行中</button>
  4. <button class="nav-item" data-tab="history">历史记录</button>
  5. </div>
  1. // 导航切换逻辑
  2. document.querySelectorAll('.nav-item').forEach(item => {
  3. item.addEventListener('click', () => {
  4. document.querySelector('.nav-item.active').classList.remove('active');
  5. item.classList.add('active');
  6. showTab(item.dataset.tab);
  7. });
  8. });

2.2 任务选择面板

任务选择区域采用卡片式设计,支持多选与单选模式:

  1. <div class="task-selector">
  2. <div class="task-card" data-id="1">
  3. <h3>数据清洗</h3>
  4. <p>执行时间:2分钟</p>
  5. <label class="checkbox-container">
  6. <input type="checkbox" class="task-select">
  7. <span class="checkmark"></span>
  8. </label>
  9. </div>
  10. </div>
  1. /* 任务卡片样式 */
  2. .task-card {
  3. border: 1px solid #eee;
  4. border-radius: 8px;
  5. padding: 15px;
  6. margin-bottom: 10px;
  7. transition: all 0.3s;
  8. }
  9. .task-card:active {
  10. transform: scale(0.98);
  11. box-shadow: 0 2px 5px rgba(0,0,0,0.1);
  12. }

三、核心逻辑实现

3.1 任务调度引擎

调度引擎采用优先级队列算法,核心实现:

  1. class TaskScheduler {
  2. constructor() {
  3. this.queue = [];
  4. this.running = false;
  5. }
  6. addTask(task) {
  7. this.queue.push(task);
  8. this.queue.sort((a, b) => b.priority - a.priority);
  9. }
  10. async execute() {
  11. if (this.running) return;
  12. this.running = true;
  13. while (this.queue.length > 0) {
  14. const task = this.queue.shift();
  15. await this.runTask(task);
  16. }
  17. this.running = false;
  18. }
  19. async runTask(task) {
  20. try {
  21. task.status = 'running';
  22. await task.execute();
  23. task.status = 'completed';
  24. } catch (error) {
  25. task.status = 'failed';
  26. console.error('Task failed:', error);
  27. }
  28. }
  29. }

3.2 任务执行状态管理

实现完整的状态生命周期管理:

  1. const taskStates = {
  2. PENDING: 'pending',
  3. RUNNING: 'running',
  4. COMPLETED: 'completed',
  5. FAILED: 'failed'
  6. };
  7. class Task {
  8. constructor(id, script, priority = 1) {
  9. this.id = id;
  10. this.script = script;
  11. this.priority = priority;
  12. this.state = taskStates.PENDING;
  13. this.startTime = null;
  14. this.endTime = null;
  15. }
  16. async execute() {
  17. this.state = taskStates.RUNNING;
  18. this.startTime = new Date();
  19. try {
  20. // 实际任务执行逻辑
  21. await this.script();
  22. this.endTime = new Date();
  23. this.state = taskStates.COMPLETED;
  24. } catch (error) {
  25. this.state = taskStates.FAILED;
  26. throw error;
  27. }
  28. }
  29. }

四、性能优化策略

4.1 内存管理方案

  • 任务分片:将大任务拆分为多个子任务
  • 资源释放:任务完成后立即释放引用
  • 防抖处理:高频操作添加延迟执行
  1. // 任务分片示例
  2. function splitTask(task, chunkSize = 100) {
  3. const chunks = [];
  4. for (let i = 0; i < task.data.length; i += chunkSize) {
  5. chunks.push(task.data.slice(i, i + chunkSize));
  6. }
  7. return chunks.map(chunk => ({
  8. ...task,
  9. data: chunk
  10. }));
  11. }

4.2 执行效率提升

  • Web Worker:将耗时任务移至后台线程
  • 缓存机制:复用已加载的任务脚本
  • 并行执行:合理控制并发任务数
  1. // Web Worker示例
  2. const worker = new Worker('task-worker.js');
  3. worker.postMessage({ type: 'execute', taskId: 123 });
  4. worker.onmessage = (e) => {
  5. if (e.data.type === 'progress') {
  6. updateProgress(e.data.value);
  7. } else if (e.data.type === 'complete') {
  8. handleTaskCompletion(e.data.result);
  9. }
  10. };

五、安全与异常处理

5.1 输入验证机制

  • 脚本白名单:限制可执行的API
  • 参数校验:验证任务参数有效性
  • 沙箱环境:隔离任务执行上下文
  1. // 简单的API白名单实现
  2. const allowedAPIs = new Set([
  3. 'fetch',
  4. 'setTimeout',
  5. 'console.log'
  6. ]);
  7. function validateScript(script) {
  8. const forbidden = /(eval|Function|new\s+Function)/i;
  9. if (forbidden.test(script)) {
  10. throw new Error('Unsafe script detected');
  11. }
  12. return true;
  13. }

5.2 错误恢复策略

  • 重试机制:对可恢复错误自动重试
  • 降级处理:关键任务失败时的备用方案
  • 日志记录:完整记录任务执行轨迹
  1. // 带重试的任务执行
  2. async function executeWithRetry(task, maxRetries = 3) {
  3. let retries = 0;
  4. while (retries <= maxRetries) {
  5. try {
  6. await task.execute();
  7. return;
  8. } catch (error) {
  9. retries++;
  10. if (retries > maxRetries) {
  11. logError(task.id, error);
  12. task.state = taskStates.FAILED;
  13. return;
  14. }
  15. await new Promise(resolve => setTimeout(resolve, 1000 * retries));
  16. }
  17. }
  18. }

六、扩展功能实现

6.1 定时任务支持

集成定时执行功能,支持Cron表达式:

  1. // 简化版定时器实现
  2. class CronScheduler {
  3. constructor() {
  4. this.tasks = new Map();
  5. }
  6. addTask(id, cronExpr, taskFn) {
  7. const schedule = this.parseCron(cronExpr);
  8. this.tasks.set(id, { schedule, taskFn });
  9. this.startTimer(id);
  10. }
  11. startTimer(id) {
  12. const now = new Date();
  13. const task = this.tasks.get(id);
  14. // 计算下次执行时间并设置定时器
  15. // 实际实现需包含完整的cron解析逻辑
  16. }
  17. }

6.2 任务依赖管理

实现任务间的依赖关系处理:

  1. class DependencyManager {
  2. constructor() {
  3. this.graph = new Map();
  4. }
  5. addDependency(taskId, dependsOn) {
  6. if (!this.graph.has(taskId)) {
  7. this.graph.set(taskId, new Set());
  8. }
  9. this.graph.get(taskId).add(dependsOn);
  10. }
  11. getExecutableTasks() {
  12. const executable = [];
  13. this.graph.forEach((deps, taskId) => {
  14. if (deps.size === 0 ||
  15. [...deps].every(depId => this.isCompleted(depId))) {
  16. executable.push(taskId);
  17. }
  18. });
  19. return executable;
  20. }
  21. }

总结与展望

本文提出的H5任务脚本选择与执行中心设计方案,通过模块化架构、响应式设计和完善的任务管理机制,为Web应用提供了高效可靠的任务处理能力。实际开发中,可根据具体需求扩展任务类型、优化调度算法,并集成更复杂的依赖管理和错误恢复机制。随着Web技术的不断发展,未来可探索将服务端任务调度能力与前端深度整合,构建更强大的全栈任务处理系统。