@@ -31,6 +31,7 @@ public class UploadQueueItem
3131 {
3232 public string FilePath { get ; set ; }
3333 public int RetryCount { get ; set ; }
34+ public DateTime AddedTime { get ; set ; }
3435 }
3536
3637 /// <summary>
@@ -40,6 +41,8 @@ public abstract class BaseUploadQueue : IDisposable
4041 {
4142 protected const int BATCH_SIZE = 10 ; // 批量上传大小
4243 protected const int MAX_RETRY_COUNT = 3 ; // 最大重试次数
44+ protected const int MAX_QUEUE_SIZE = 1000 ; // 队列最大大小限制
45+ protected const int MAX_ITEM_AGE_HOURS = 72 ; // 队列项最大存活时间(72小时)
4346
4447 /// <summary>
4548 /// 上传队列
@@ -134,6 +137,7 @@ public void InitializeQueue()
134137
135138 int restoredCount = 0 ;
136139 int skippedCount = 0 ;
140+ int expiredCount = 0 ;
137141
138142 foreach ( var item in queueData )
139143 {
@@ -144,6 +148,13 @@ public void InitializeQueue()
144148 continue ;
145149 }
146150
151+ // 检查队列项是否过期
152+ if ( ( DateTime . Now - item . AddedTime ) . TotalHours > MAX_ITEM_AGE_HOURS )
153+ {
154+ expiredCount ++ ;
155+ continue ;
156+ }
157+
147158 // 验证文件格式和大小
148159 if ( ! IsValidFile ( item . FilePath ) )
149160 {
@@ -155,7 +166,8 @@ public void InitializeQueue()
155166 _uploadQueue . Enqueue ( new UploadQueueItem
156167 {
157168 FilePath = item . FilePath ,
158- RetryCount = item . RetryCount
169+ RetryCount = item . RetryCount ,
170+ AddedTime = item . AddedTime
159171 } ) ;
160172 restoredCount ++ ;
161173 }
@@ -164,7 +176,7 @@ public void InitializeQueue()
164176
165177 if ( restoredCount > 0 )
166178 {
167- LogHelper . WriteLogToFile ( $ "[{ GetType ( ) . Name } ] 已恢复上传队列:{ restoredCount } 个文件,跳过{ skippedCount } 个无效文件", LogHelper . LogType . Event ) ;
179+ LogHelper . WriteLogToFile ( $ "[{ GetType ( ) . Name } ] 已恢复上传队列:{ restoredCount } 个文件,跳过{ skippedCount } 个无效文件,过期 { expiredCount } 个文件 ", LogHelper . LogType . Event ) ;
168180 // 如果恢复了队列,触发处理
169181 _ = Task . Run ( async ( ) =>
170182 {
@@ -178,9 +190,9 @@ public void InitializeQueue()
178190 }
179191 } ) ;
180192 }
181- else if ( skippedCount > 0 )
193+ else if ( skippedCount > 0 || expiredCount > 0 )
182194 {
183- LogHelper . WriteLogToFile ( $ "[{ GetType ( ) . Name } ] 队列恢复完成:跳过{ skippedCount } 个无效文件", LogHelper . LogType . Event ) ;
195+ LogHelper . WriteLogToFile ( $ "[{ GetType ( ) . Name } ] 队列恢复完成:跳过{ skippedCount } 个无效文件,过期 { expiredCount } 个文件 ", LogHelper . LogType . Event ) ;
184196 }
185197 }
186198 catch ( Exception ex )
@@ -215,7 +227,7 @@ protected async Task SaveQueueToFileAsync(CancellationToken cancellationToken =
215227 {
216228 FilePath = item . FilePath ,
217229 RetryCount = item . RetryCount ,
218- AddedTime = DateTime . Now
230+ AddedTime = item . AddedTime
219231 } ) ;
220232 }
221233
@@ -274,16 +286,70 @@ protected void ClearQueueFile()
274286 }
275287 }
276288
289+ /// <summary>
290+ /// 清理队列中的过期项
291+ /// </summary>
292+ /// <returns>清理的项数</returns>
293+ private int CleanupExpiredItems ( )
294+ {
295+ int cleanedCount = 0 ;
296+ var tempItems = new List < UploadQueueItem > ( ) ;
297+
298+ // 先全部出队
299+ while ( _uploadQueue . TryDequeue ( out UploadQueueItem item ) )
300+ {
301+ // 检查是否过期
302+ if ( ( DateTime . Now - item . AddedTime ) . TotalHours <= MAX_ITEM_AGE_HOURS )
303+ {
304+ tempItems . Add ( item ) ;
305+ }
306+ else
307+ {
308+ cleanedCount ++ ;
309+ }
310+ }
311+
312+ // 重新入队未过期项
313+ foreach ( var item in tempItems )
314+ {
315+ _uploadQueue . Enqueue ( item ) ;
316+ }
317+
318+ if ( cleanedCount > 0 )
319+ {
320+ LogHelper . WriteLogToFile ( $ "[{ GetType ( ) . Name } ] 清理{ cleanedCount } 个过期队列项", LogHelper . LogType . Event ) ;
321+ }
322+
323+ return cleanedCount ;
324+ }
325+
277326 /// <summary>
278327 /// 将文件加入上传队列
279328 /// </summary>
280329 protected void EnqueueFile ( string filePath , int retryCount = 0 , CancellationToken cancellationToken = default )
281330 {
282- _uploadQueue . Enqueue ( new UploadQueueItem
331+ var newItem = new UploadQueueItem
283332 {
284333 FilePath = filePath ,
285- RetryCount = retryCount
286- } ) ;
334+ RetryCount = retryCount ,
335+ AddedTime = DateTime . Now
336+ } ;
337+
338+ // 队列大小检查,防止无限增长
339+ if ( _uploadQueue . Count >= MAX_QUEUE_SIZE )
340+ {
341+ // 先尝试清理过期项
342+ int cleanedCount = CleanupExpiredItems ( ) ;
343+
344+ // 清理后仍然满,则记录警告并跳过
345+ if ( _uploadQueue . Count >= MAX_QUEUE_SIZE )
346+ {
347+ LogHelper . WriteLogToFile ( $ "[{ GetType ( ) . Name } ] 队列已满({ MAX_QUEUE_SIZE } ),清理{ cleanedCount } 个过期项后仍满,跳过入队: { Path . GetFileName ( filePath ) } ", LogHelper . LogType . Warning ) ;
348+ return ;
349+ }
350+ }
351+
352+ _uploadQueue . Enqueue ( newItem ) ;
287353
288354 // 异步保存队列到文件
289355 _ = Task . Run ( async ( ) =>
0 commit comments