SoC TaskManager Implementation Worklog
이 장은 현재 기준 DeviceAgent TaskManager에 들어간 실제 작업내역을 업체가 따라 할 수 있는 단위로 정리한다.
소스 레벨 구현 위치와 method 단위 설명은 Source-Level Implementation Guide를 기준으로 본다. 이 장은 “무슨 파일을 왜 만들었고, 업체가 그 파일에서 무엇을 채워야 하는지”에 집중한다.
추가/정리된 핵심 파일
| 파일 | 작업 내용 |
|---|---|
TaskManager.java |
control method entry, task/workflow queue, async/wait/direct 실행, event callback, summary/detail output |
TaskEventListener.java |
외부 listener가 onTaskEvent를 받을 수 있는 interface |
TaskReasonContract.java |
error code를 source-agnostic reason_code, recoverability, suggested_action으로 변환 |
DevicePlanningContextProvider.java |
상위 planner/server가 실행 전 참고할 battery/map/location/cleaning/movement/task_manager/capability snapshot 생성 |
TaskIngressClassifier.java |
들어온 method가 task/control/progress/result 성격인지 분류 |
TaskBundleValidator.java |
strict validation 시 method별 필수 slot/key 검증 |
TaskPolicyRegistry.java |
execution mode, queue, priority, timeout, retry, state-aware 정책 |
TaskExecutorRegistry.java |
taskMethod를 실제 executor에 연결 |
TaskExecutorBootstrap.java |
skeleton executor 등록 |
파일별 상세 작업내역
| 파일 | 현재 반영된 구조 | 업체가 이어서 해야 할 일 |
|---|---|---|
MainApi.java |
executeMethod(...) 앞단에서 TaskManager.handleControlMethod(...) 호출, 미처리 method는 legacy 실행으로 위임 |
TaskManager hook이 모든 외부 method path에서 동일하게 적용되는지 확인 |
TaskManager.java |
submitTask, submitWorkflow, query/cancel/status/progress/context/classify API 제공 |
실제 제품 queue 정책, persistence, lifecycle, terminal event 보장 강화 |
TaskPolicyRegistry.java |
method별 queue/mode/timeout/cancel/compensation 정책 제공 | 제품 기능별 timeout/retry/cancel 정책 확정 |
TaskBundleValidator.java |
strict validation 시 method별 필수 key 확인 | 모든 제품 command의 slot schema 추가 |
TaskExecutorRegistry.java |
taskMethod -> executor lookup 구조 제공 | 실제 domain executor를 등록하고 누락 method 감지 |
TaskExecutorBootstrap.java |
movement/cleaning/LLM/TTS/IoT/update skeleton binding 제공 | dry-run executor를 실제 executor로 교체 또는 adapter 연결 |
TaskReasonContract.java |
error code -> reason/recoverability/suggested_action 변환 | domain별 error code를 표준 reason에 추가 mapping |
DevicePlanningContextProvider.java |
battery/map/location/cleaning/movement/task_manager/capability snapshot 제공 | 실제 room list, current room, blocked/path 상태, capability flag 채우기 |
TaskIngressClassifier.java |
method를 command/control/progress/result/sensor/trigger/event로 분류 | MQTT/App/예약 source의 method naming과 signalType 정책 확정 |
MainApi 연결 작업
핵심 변화:
기존:
MainApi.executeMethod(...)
-> executeMethodInternal(...)
변경:
MainApi.executeMethod(...)
-> TaskManager.handleControlMethod(...)
-> handled이면 return
-> TaskManager.executeLegacy(...)
-> executeMethodInternal(...)
이 연결의 의미:
- 기존 domain command를 제거하지 않는다.
- TaskManager API만 먼저 잡아 처리한다.
- 일반 legacy method는 기존 경로로 계속 수행한다.
- TaskManager 내부에서 실제 command 실행이 필요할 때도
TaskCommandFactory를 통해 기존executeMethodInternal(...)호출을 재사용한다.
TaskManager Core 작업
TaskManager.java에 들어간 core 책임:
| 책임 | 설명 |
|---|---|
| API dispatch | submitTask, submitWorkflow, getTaskStatus, listTasks, getQueueStatus, updateTaskProgress, cancelTask 분기 |
| record 관리 | TaskRecord로 task state, input, result, workflow step, timestamps 저장 |
| queue 관리 | queue별 executor와 metric 관리 |
| execution mode | DIRECT, QUEUED_WAIT, ASYNC 실행 모드 분리 |
| workflow | subTasks, parallelGroup, currentStepIndex, currentStepMethod, subTaskStates 관리 |
| lifecycle | cancel/compensation command 연결 |
| callback | notifyTaskEvent(...)로 listener와 AppCmd callback 전송 |
Policy/Validation 작업
TaskPolicyRegistry는 method별 실행 성격을 정리한다.
| Queue | 대표 method | 의도 |
|---|---|---|
movement |
returnToStation, setMoveTo, setMoving |
이동/복귀/정지 계열 |
cleaning |
setAirCleanerOperation, setStatusClean |
청정 동작 계열 |
ai |
setChangeLlmStatus, setLlmTts |
LLM/TTS 상태와 출력 |
settings |
setConfig |
설정 변경 |
state |
setMainState, getMainState |
기기 main state |
update |
OTAUpdateArmResult, OTAUpdateMcuResult, setFirmwareUpdateStatus |
펌웨어/update |
TaskBundleValidator는 strict validation이 켜졌을 때 필수 key를 검사한다. 예를 들어 setMoveTo는 위치 후보 key가 필요하고, setAirCleanerOperation은 action/mode/speed/operation 중 하나가 필요하다.
Executor 작업
현재 executor bootstrap은 skeleton 형태다.
| Executor | 연결된 method | 업체 구현 방향 |
|---|---|---|
MovementTaskExecutor |
returnToStation, setMoveTo, setMoving, stopMovement |
이동 manager/robot controller와 실제 연결 |
CleaningAmpTaskExecutor |
setAirCleanerOperation, setStatusClean, stopCleaning, ampStop |
기존 청정 handler와 cleaning transaction 연결 |
LlmTtsTaskExecutor |
setChangeLlmStatus, setLlmTts, stopLlm, stopTts |
LLM/TTS manager 연결 |
IotTaskExecutor |
setDeviceStatus, setConfig, getConfig |
IoT command/report 연결 |
UpdateTaskExecutor |
OTA/update method | update manager 연결 |
Event/Reason 작업
notifyTaskEvent(...)는 event payload를 구성한 뒤 두 경로로 보낸다.
1. TaskEventListener.onTaskEvent(...)
2. AppCmd.INSTANCE.sendModuleCallback_main(eventData)
event payload는 아래 성격을 포함해야 한다.
| payload 계열 | 예시 |
|---|---|
| task identity | taskId, taskMethod, workflowName |
| state | taskState, status, progress, stage, message |
| workflow | currentStepIndex, currentStepMethod, subTaskStates |
| reason | reason_code, reason_params, recoverability, suggested_action, requires_cloud_decision |
| trace | source, cloud_workflow_id, mqtt_message_id, app_request_id, schedule_id |
Planning Context 작업
DevicePlanningContextProvider가 제공하는 snapshot은 Cloud planner뿐 아니라 MQTT server policy, App UI, 내부 예약 정책에서도 사용할 수 있다.
현재 채워진 bundle:
main_state
battery
map
location
cleaning
movement
task_manager
capabilities
업체가 반드시 보강해야 할 부분:
map.rooms실제 room 목록location.current_room_id/namemovement.blocked와 path blocked 상태capabilities를 제품/펌웨어/설정 기반으로 동적으로 산출- queue busy 상태와 running task summary의 실기기 trace
Control API 작업내역
| Method | 의미 |
|---|---|
submitTask |
단일 task 등록 |
submitWorkflow |
여러 subtask workflow 등록 |
getTaskStatus |
task 상세 상태 조회 |
listTasks |
task 목록 조회 |
getQueueStatus |
queue 상태 조회 |
updateTaskProgress |
task progress/status/stage/message 갱신 |
cancelTask |
task 취소 |
getTaskManagerStatus |
manager enabled/queue/metric 상태 조회 |
getDevicePlanningContext |
Cloud planner 또는 서버 정책 판단 전 device context snapshot 조회 |
classifyTaskIngress |
method/signal type 분류 |
Executor Bootstrap 작업내역
| Executor | Method |
|---|---|
| Movement | returnToStation, setMoveTo, setMoving, stopMovement |
| Cleaning | setAirCleanerOperation, setStatusClean, stopCleaning, ampStop |
| LLM/TTS | setChangeLlmStatus, setLlmTts, stopLlm, stopTts |
| IoT | setDeviceStatus, setConfig, getConfig |
| Update | OTAUpdateArmResult, OTAUpdateMcuResult, setFirmwareUpdateStatus |
테스트 작업내역
app/src/test/java/com/sk/airbot/deviceagent/task/TaskManagerTest.java
app/src/test/java/com/sk/airbot/deviceagent/task/TaskManagerIntegrationTest.java
app/src/androidTest/java/com/sk/airbot/deviceagent/task/TaskManagerInstrumentedTest.java
추가되어야 할 테스트
| 테스트 | 목적 |
|---|---|
| Cloud source submitTask | cloud_workflow_id가 event까지 보존되는지 확인 |
| MQTT source submitTask | mqtt_message_id와 external_command_id가 event까지 보존되는지 확인 |
| Workflow 3-step | step event와 terminal event 순서 확인 |
| Validation failure | 필수 slot 누락 시 validation_failed와 terminal/reject 처리 확인 |
| Reason mapping | PATH_BLOCKED, ROOM_NOT_FOUND, LOW_BATTERY mapping 확인 |
| Legacy passthrough | TaskManager가 처리하지 않는 기존 method가 기존 경로로 동작하는지 확인 |
| Planning context | battery/map/location/cleaning/movement/task_manager/capabilities가 채워지는지 확인 |