Files
crawler-plugin/backend-java/src/main/java/com/nanri/aiimage/config/NotificationProperties.java
T
huangzd1997 f2ada02383 feat(保留期清理): 补齐 7 处只增不删的数据;修结果对象孤儿
审核发现一批表/元数据只增不删,且对象存储存在活跃泄漏:

- module-cleanup 漏收 task_result_item / task_result_payload 的 payload 指针,
  每晚删完行就在 json-server 桶留下孤儿对象;指针收集触顶从"截断后照样删整组"
  改为任务组二分拆分,拆到单任务仍触顶则整组不删并记 error(截断会让指针随行消失)
- 结果文件对象此前从不回收(只删 DB 行、对象留在桶里),现改为事务提交后
  按 file_result / task_file_job 的 result_file_url 逐个回收
- 新增 7 个保留期清理:device_log_file 元数据、price_track_loop_run、撞款扫描行、
  密钥用量日统计、紫鸟记忆过期行、PUBLISH 任务、BRAND 任务。后两者刻意不复用
  module-cleanup(BRAND 不写 biz_file_task;PUBLISH 单任务可达数万行),
  改为调各自既有的业务删除入口,保证结果对象与子表一起回收
- 未读通知补保留期(180 天,已读仍 90 天);ZiniaoMemoryStoreService.deleteExpired
  此前全库无调用方(实现了没接线),现已挂定时任务

全部沿用既有范式:@Scheduled + 分布式锁单实例 + 分批 + 单轮批次数上限 + 失败只记日志。
2026-09-16 01:59:28 +08:00

79 lines
3.4 KiB
Java

package com.nanri.aiimage.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* 站内通知(铃铛)扫描与探测配置:
* 任务失败扫描、下游服务健康探测、已读通知保留期。
*/
@Data
@ConfigurationProperties(prefix = "aiimage.notification")
public class NotificationProperties {
/** 扫描总开关:关闭后任务失败扫描与服务探测都不执行(应急降噪)。 */
private boolean scanEnabled = true;
/** 扫描间隔(毫秒),默认 5 分钟(任务失败聚合按小时去重,高频扫描不会重复提醒)。 */
private long scanIntervalMs = 5 * 60 * 1000L;
/** 首次执行延迟(毫秒),默认 2 分钟,避开启动阶段的数据库压力。 */
private long scanInitialDelayMs = 2 * 60 * 1000L;
/** 任务失败扫描开关。 */
private boolean taskScanEnabled = true;
/** 任务失败回看窗口(分钟):窗口内进入失败终态的任务参与聚合。 */
private int taskFailedWindowMinutes = 60;
/** 单轮任务扫描最多处理条数(超出下一轮继续,避免大表拖垮扫描)。 */
private int taskScanMaxRows = 1000;
/** 服务健康探测开关。 */
private boolean serviceProbeEnabled = true;
/** 品牌检测服务地址(主机A 15126,探测 /api/version);留空=跳过该项探测。 */
private String brandServiceUrl = "";
/** 跟价任务 API 地址(主机B 18960,探测根路径);留空=跳过该项探测。 */
private String priceTrackApiUrl = "";
/** jikip 代理接口探测开关(复用余额查询接口判活,使用 user-secret 的 jikip 配置)。 */
private boolean jikipProbeEnabled = true;
/** 麦象(18960 任务调度)异常扫描开关:任务停滞/失败/队列积压 → 管理员通知。 */
private boolean maixiangScanEnabled = true;
/**
* 麦象后台接口令牌(18960 console token)。留空=跳过麦象异常扫描——
* 该令牌与「跟价任务 API 地址」(priceTrackApiUrl) 一起构成后台只读接口的访问凭据。
*/
private String maixiangConsoleToken = "";
/** 麦象批量任务停滞阈值(分钟):status=0/1 且超过该时长无更新视为卡住。 */
private int maixiangStuckMinutes = 60;
/** 麦象单任务滞留阈值(分钟):创建超时仍未完成(status=0/1)视为滞留/无人消费。 */
private int maixiangSingleStuckMinutes = 30;
/** 麦象任务失败告警阈值(条):近 30 分钟窗口内失败数达到该值才告警。 */
private int maixiangFailMinCount = 1;
/** 麦象队列积压阈值(条):task:queue 待处理数达到该值告警。 */
private int maixiangQueuePendingThreshold = 300;
/** 麦象队列积压阈值(条):task:processing 处理中数达到该值告警。 */
private int maixiangQueueProcessingThreshold = 100;
/** 已读通知保留天数(超期自动清理),默认 90 天。 */
private int readRetentionDays = 90;
/**
* 未读通知保留天数,默认 180 天(比已读长一倍)。
*
* <p>未读通知此前永不清理:不看铃铛的用户会无限累积。保留期给得更宽,
* 是因为未读意味着"用户可能还没看到",但也不能永远留着。
*/
private int unreadRetentionDays = 180;
}