diff --git a/src/main/kotlin/OneDriveTransferCenter.kt b/src/main/kotlin/OneDriveTransferCenter.kt index f9e7d03..3bdb775 100644 --- a/src/main/kotlin/OneDriveTransferCenter.kt +++ b/src/main/kotlin/OneDriveTransferCenter.kt @@ -29,11 +29,9 @@ import java.util.concurrent.* object OneDriveTransferCenter { val executor = - OneDriveTransferTaskExecutor(1, DefaultOneDriveTransferCallback, ArrayBlockingQueue(100)) + OneDriveTransferTaskExecutor(1, DefaultOneDriveTransferCallback, ArrayBlockingQueue(Integer.MAX_VALUE)) - fun submitUploadTask(task: OneDriveTransferTask) { - executor.submitTransferTask(task) - } + fun submitUploadTask(task: OneDriveTransferTask): Boolean = executor.submitTransferTask(task) fun cancelUploadTask(task: OneDriveTransferTask): Boolean = executor.cancelTransferTask(task) @@ -291,9 +289,12 @@ class OneDriveTransferTaskExecutor( } } - fun submitTransferTask(task: OneDriveTransferTask) { - callback.onTransferTaskCreated(task) - taskQueue.offer(task) + fun submitTransferTask(task: OneDriveTransferTask): Boolean { + if (taskQueue.remainingCapacity() > 0) { + callback.onTransferTaskCreated(task) + return taskQueue.offer(task) + } + return false } fun cancelTransferTask(task: OneDriveTransferTask): Boolean { @@ -348,9 +349,13 @@ class OneDriveTransferTaskExecutor( } logger.warn(e) { "OneDrive 中转任务执行失败: ${e.message}" } progress.status = OneDriveTransferStatus.FAILURE - callback.onTransferFailure(task, progress.apply { - this.exception = e - }) + try { + callback.onTransferFailure(task, progress.apply { + this.exception = e + }) + } catch (e: Exception) { + logger.warn(e) { "OneDrive 中转任务失败回调失败: ${e.message}" } + } } finally { logger.info { "线程 $id 任务执行完毕: ${task.document.fileName}" } threadStatusMap.remove(id) diff --git a/src/main/kotlin/Services.kt b/src/main/kotlin/Services.kt index 3a52fbc..37ea8fa 100644 --- a/src/main/kotlin/Services.kt +++ b/src/main/kotlin/Services.kt @@ -109,19 +109,21 @@ class OneDriveTransferService( fun submitUploadDocumentTask(userId: Long, messageId: Int, document: Document) { val transferSetting = accountManager.getTransferSetting(userId) ?: throw OneDriveNotLoginException() - OneDriveTransferCenter.submitUploadTask( - OneDriveTransferTask( - userId, - bot, - this, - document, - transferSetting.driveId, - transferSetting.storagePath, - ).apply { - extra["chatId"] = userId - extra["messageId"] = messageId - }.also { tasks.add(it) } - ) + val task = OneDriveTransferTask( + userId, + bot, + this, + document, + transferSetting.driveId, + transferSetting.storagePath, + ).apply { + extra["chatId"] = userId + extra["messageId"] = messageId + } + val submitted = OneDriveTransferCenter.submitUploadTask(task) + if (submitted) { + tasks.add(task) + } } fun cancelTask(userId: Long, replyMessageId: Int): Boolean {