Files
ipam/backend/app/tasks/celery_app.py
T
Your Name 8775c9836d feat(snmp): 实现网络设备自动轮询定时任务
之前只有 arp/mac/interface_poll_interval 字段但没有实际调度,
SNMP 设备添加后永远不会被自动采集。

新增 poll_snmp_devices Celery 定时任务:
- 遍历所有活跃且配置了 SNMP 凭据的设备
- 按各设备的 poll_interval 判断是否到期,到期才轮询
- 用 asyncio.run 执行异步的 SNMPService.poll_device
- Beat 每 60 秒触发检查,新设备 last_polled_at 为空会立即轮询
2026-08-12 10:56:40 +08:00

62 lines
1.9 KiB
Python

from celery import Celery
from celery.schedules import crontab
from app.core.config import settings
# 创建 Celery 应用
celery_app = Celery(
'ipam_tasks',
broker=settings.CELERY_BROKER_URL,
backend=settings.CELERY_RESULT_BACKEND
)
# 配置
celery_app.conf.update(
task_serializer='json',
accept_content=['json'],
result_serializer='json',
timezone='Asia/Shanghai',
enable_utc=True,
task_track_started=True,
task_time_limit=30 * 60, # 任务超时30分钟
worker_prefetch_multiplier=1,
worker_max_tasks_per_child=1000,
)
# 必须在配置后导入并注册任务
from app.tasks.scan_tasks import register_tasks
_tasks = register_tasks(celery_app)
# 导出任务函数
scan_network_task = _tasks['scan_network_task']
scan_single_ip_task = _tasks['scan_single_ip_task']
full_network_scan = _tasks['full_network_scan']
update_all_statistics = _tasks['update_all_statistics']
quick_status_update = _tasks['quick_status_update']
poll_snmp_devices = _tasks['poll_snmp_devices']
# 定时任务配置
celery_app.conf.beat_schedule = {
# 每小时执行一次全量扫描
'full-scan-every-hour': {
'task': 'app.tasks.scan_tasks.full_network_scan',
'schedule': 3600.0, # 每小时
'args': (True, True, True) # ping, arp, dns
},
# 每天凌晨2点执行一次完整扫描
'full-scan-daily': {
'task': 'app.tasks.scan_tasks.full_network_scan',
'schedule': crontab(hour=2, minute=0),
'args': (True, True, True)
},
# 每15分钟更新一次统计
'update-stats-every-15min': {
'task': 'app.tasks.scan_tasks.update_all_statistics',
'schedule': 900.0, # 15分钟
},
# 每60秒检查一次 SNMP 设备轮询(各设备按自己的 poll_interval 判断是否到期)
'poll-snmp-devices-every-60s': {
'task': 'app.tasks.scan_tasks.poll_snmp_devices',
'schedule': 60.0,
},
}