Skip to content

Agent Task 实现

该文档会简述 JsonRpc 的基本使用,若完全不了解请看本文档的 注册任务 部分,此后只会提供方法名与结构体

注册任务

若 Agent 需要获取 Server 下发的任务,需要在一个 WebSocket 长连接内订阅任务获取的方法。中途退出、WebSocket 断线、使用 Http、或主动取消订阅 均不会再接收到来自 Server 的任务

涉及到的方法名称为 task_register_task,这是一个 subscription 方法。对应的取消订阅方法为 task_unregister_task ,由框架自动生成,调用后将停止接收任务

需要构建如下的结构体以注册:

json
{
    "jsonrpc": "2.0",
    "method": "task_register_task",
    "params": {
        "uuid": "AGENT_UUID_HERE" // Agent UUID
    },
    "id": 1
}

或在 params 字段使用元组,需要确保位置正确:

json
{
    "jsonrpc": "2.0",
    "method": "task_register_task",
    "params": [
        "AGENT_UUID_HERE" // Agent UUID
    ],
    "id": 1 // 该 ID 可自定义,返回值也带统一 ID 用于辨别哪一个请求
}

两种调用方式等价

注册成功后,会收到来自服务器的返回信息:

json
{
    "jsonrpc": "2.0",
    "id": 1,
    "result": 5293582878088374 // 订阅 ID
}

接收任务

Agent 会在这一 WebSocket 长连接中接收到 method 为 task_register_task 的 JsonRpc Request,其中 params 字段如下:

json
{
    "subscription": 5293582878088374,
    // 为上面的订阅 ID,可用于校验 (若在同一长连接中注册多个任务接收器)
    "result": {
        "task_id": 3,
        // 数据库中的 ID 字段,上报任务结果需要使用
        "task_token": "k6bsrBv1hS",
        // 字段仅任务注册者可获取,用于校验上传者是否为接收者,任务下发方 / Server 均不主动知晓
        "task_event_type": {
            // 任务主体,该结构体参考 Task 总览
        }
    }
}

上报结果

在处理完下发的 Task 后,可以通过 task_upload_task_result 方法来上传结果

需要构建如下的结构体以上报:

json
{
    "jsonrpc": "2.0",
    "method": "task_upload_task_result",
    "params": {
        "token": "demo_token", // 上报用 Token,非 Task Token
        "task_response": {
            "task_id": 3, // Task ID
            "agent_uuid": "AGENT_UUID_HERE", // 下发任务时指定的 Agent UUID
            "task_token": "k6bsrBv1hS", // 下发任务时生成的 Task Token
            "timestamp": 1769341269012, // 完成时的毫秒时间戳
            "success": true, // 是否成功
            "error_message": "XXXXXX", // 若 success 为 false 该字段必需;若 success 为 true 该字段可选
            "task_event_result": {
                // 若 success 为 true 该字段必需;若 success 为 false 该字段为空
                // 任务回报结构体,该结构体参考 Task 总览
            }
        }
    },
    "id": 2
}

或在 params 字段使用元组,需要确保位置正确:

json
{
    "jsonrpc": "2.0",
    "method": "task_upload_task_result",
    "params": [
        "demo_token", // 上报用 Token,非 Task Token
        {
            "task_id": 3, // Task ID
            "agent_uuid": "AGENT_UUID_HERE", // 下发任务时指定的 Agent UUID
            "task_token": "k6bsrBv1hS", // 下发任务时生成的 Task Token
            "timestamp": 1769341269012, // 完成时的毫秒时间戳
            "success": true, // 是否成功
            "error_message": "XXXXXX", // 若 success 为 false 该字段必需;若 success 为 true 该字段可选
            "task_event_result": {
                // 若 success 为 true 该字段必需;若 success 为 false 该字段为空
                // 任务回报结构体,该结构体参考 Task 总览
            }
        }
    ],
    "id": 2 // 该 ID 可自定义,返回值也带统一 ID 用于辨别哪一个请求
}

两种调用方式等价

返回值

上报成功后,会收到来自服务器的返回信息:

json
{
    "jsonrpc": "2.0",
    "id": 2,
    "result": {
        "id": 3 // 在数据库中表的 ID 字段
    }
}

Server 会使用 token / task_id / agent_uuid / task_token 进行鉴权,需四项均统一