| | | 1 | | using Hangfire; |
| | | 2 | | using Services.SignalRServices; |
| | | 3 | | using Services.HangfireService; |
| | | 4 | | |
| | | 5 | | namespace Services.SearchServices.OrderSearch; |
| | | 6 | | |
| | | 7 | | /// <summary> |
| | | 8 | | /// Раз в минуту сверяет ES с БД и сразу точечно исправляет любое расхождение. |
| | | 9 | | /// </summary> |
| | | 10 | | public class OrderSearchDriftCheckJob |
| | | 11 | | { |
| | | 12 | | public const string JobId = "OrderSearchDriftCheckJob"; |
| | | 13 | | public const string DefaultCron = "* * * * *"; |
| | | 14 | | public const string QueueName = HangfireQueueNames.OrderSearch; |
| | | 15 | | |
| | | 16 | | private readonly IOrderSearchDriftChecker _driftChecker; |
| | | 17 | | private readonly IOrderSearchSyncService _syncService; |
| | | 18 | | private readonly IOrderSearchIndexOperationLock _indexOperationLock; |
| | | 19 | | |
| | 3 | 20 | | public OrderSearchDriftCheckJob( |
| | 3 | 21 | | IOrderSearchDriftChecker driftChecker, |
| | 3 | 22 | | IOrderSearchSyncService syncService, |
| | 3 | 23 | | IOrderSearchIndexOperationLock indexOperationLock) |
| | | 24 | | { |
| | 3 | 25 | | _driftChecker = driftChecker; |
| | 3 | 26 | | _syncService = syncService; |
| | 3 | 27 | | _indexOperationLock = indexOperationLock; |
| | 3 | 28 | | } |
| | | 29 | | |
| | | 30 | | [Queue(QueueName)] |
| | | 31 | | public async Task<string> ExecuteAsync() |
| | | 32 | | { |
| | 3 | 33 | | var operationLock = _indexOperationLock.TryAcquire(); |
| | 3 | 34 | | if (operationLock == null) |
| | | 35 | | { |
| | 1 | 36 | | return "Проверка расхождения ES пропущена: выполняется полная переиндексация."; |
| | | 37 | | } |
| | | 38 | | |
| | 2 | 39 | | using (operationLock) |
| | | 40 | | { |
| | 2 | 41 | | var result = await _driftChecker.CheckAsync("Scheduled"); |
| | | 42 | | |
| | 2 | 43 | | if (!result.Skipped && result.AbsoluteDrift > 0) |
| | | 44 | | { |
| | 1 | 45 | | var repair = await _syncService.RepairDriftAsync("Scheduled"); |
| | 1 | 46 | | if (repair.AbsoluteDriftAfter > 0) |
| | | 47 | | { |
| | | 48 | | try |
| | | 49 | | { |
| | 0 | 50 | | await NotificationService.NotifyAsync( |
| | 0 | 51 | | "ES Индекс", "#EF4444", repair.Message, "fa-triangle-exclamation"); |
| | 0 | 52 | | } |
| | 0 | 53 | | catch { /* не роняем джоб */ } |
| | | 54 | | } |
| | | 55 | | |
| | 1 | 56 | | return repair.Message; |
| | | 57 | | } |
| | | 58 | | |
| | 1 | 59 | | return result.Message; |
| | | 60 | | } |
| | 3 | 61 | | } |
| | | 62 | | } |