Upgrade packages for reset cache

This commit is contained in:
Behzad Alizadeh
2026-04-26 20:10:53 +03:30
parent 4abfe079db
commit d1c0b06ec6
4 changed files with 183 additions and 54 deletions
@@ -1,7 +1,4 @@
using System.Diagnostics;
using System.Dynamic;
using System.Text.Json;
using Caspian.WorkflowFramework.Contracts;
using Caspian.WorkflowFramework.Contracts;
using Caspian.WorkflowFramework.Models;
using Caspian.WorkflowFramework.Utility;
using Elsa.Common.Entities;
@@ -11,11 +8,15 @@ using Elsa.Workflows.Management;
using Elsa.Workflows.Management.Filters;
using Elsa.Workflows.Models;
using Elsa.Workflows.Runtime;
using Elsa.Workflows.Runtime.Filters;
using Elsa.Workflows.Runtime.Messages;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using San.MongoLogger;
using System.Diagnostics;
using System.Dynamic;
using System.Text.Json;
namespace Caspian.WorkflowFramework.Services;
public class WorkflowService : IWorkflowService, ILoggable
@@ -29,6 +30,8 @@ public class WorkflowService : IWorkflowService, ILoggable
private readonly IWorkflowInstanceStore _workflowInstanceStore;
private readonly IEventPublisher _eventPublisher;
private readonly IWorkflowDefinitionCacheManager _workflowDefinitionCacheManager;
private readonly IBookmarkStore _bookmarkStore;
private readonly IActivityExecutionStore _activityExecutionStore;
private readonly IMdbLogger<WorkflowService> _logger;
#endregion
@@ -43,6 +46,8 @@ public class WorkflowService : IWorkflowService, ILoggable
_workflowInstanceManager = _serviceProvider.GetRequiredService<IWorkflowInstanceManager>();
_workflowInstanceStore = _serviceProvider.GetRequiredService<IWorkflowInstanceStore>();
_eventPublisher = _serviceProvider.GetRequiredService<IEventPublisher>();
_bookmarkStore = _serviceProvider.GetRequiredService<IBookmarkStore>();
_activityExecutionStore = _serviceProvider.GetRequiredService<IActivityExecutionStore>();
_logger = logger;
}
#endregion
@@ -724,4 +729,117 @@ public class WorkflowService : IWorkflowService, ILoggable
}
}
#endregion
#region ForceCancelInstanceAsync
public async Task<WorkflowResponse<dynamic>> ForceCancelInstanceAsync(CancelWorkflowInstanceModel input)
{
var sw = Stopwatch.StartNew();
try
{
_logger.Log("Start ForceCancelInstanceAsync", WFInstanceId: input.WorkflowInstanceId, input);
var instance = await _workflowInstanceManager.FindByIdAsync(input.WorkflowInstanceId);
if (instance == null)
return new WorkflowResponse<dynamic> { Status = 1, Message = "Instance not found", Data = false };
// جلوگری از Resume شدن دوباره
instance.Status = WorkflowStatus.Finished;
instance.SubStatus = WorkflowSubStatus.Cancelled;
// پاک‌سازی bookmarks از دیتابیس واقعی
var bookmarkFilter = new BookmarkFilter()
{
WorkflowInstanceId = input.WorkflowInstanceId
};
await _bookmarkStore.DeleteAsync(bookmarkFilter);
// پاک‌سازی scheduled activities (در صورتی که runtime distributed باشد)
var activityFilter = new ActivityExecutionRecordFilter()
{
WorkflowInstanceId = input.WorkflowInstanceId
};
await _activityExecutionStore.DeleteManyAsync(activityFilter);
//// پاک‌سازی incidents (در پروژه‌های بزرگ ضروری است)
//await _incidentStore.DeleteManyAsync(
// x => x.WorkflowInstanceId == input.WorkflowInstanceId
//);
// ذخیره instance تغییر یافته
await _workflowInstanceManager.SaveAsync(instance);
sw.Stop();
var response = new WorkflowResponse<dynamic>
{
Status = 0,
Message = "Force cancel completed",
Data = true
};
_logger.Log("End ForceCancelInstanceAsync", WFInstanceId: instance.Id, response, sw.ElapsedMilliseconds);
return response;
}
catch (Exception ex)
{
sw.Stop();
var response = new WorkflowResponse<dynamic>
{
Status = 100,
Message = ex.Message,
Data = false
};
_logger.Log("Exception in ForceCancelInstanceAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds, ex);
return response;
}
}
#endregion
#region EvictDefFromCacheAsync
/// <inheritdoc />
public async Task EvictDefFromCacheAsync(string name, CancellationToken cancellationToken = default)
{
var sw = Stopwatch.StartNew();
try
{
_logger.Log("Start of EvictDefFromCacheAsync", name);
var defFilter = new WorkflowDefinitionFilter()
{
Name = name,
VersionOptions = VersionOptions.Published
};
var definition = await _workflowDefinitionService
.FindWorkflowDefinitionAsync(defFilter);
await _workflowDefinitionCacheManager.EvictWorkflowDefinitionAsync(definition.DefinitionId);
var workflowDefinitionFilter = new WorkflowDefinitionFilter()
{
DefinitionHandle = WorkflowDefinitionHandle.ByDefinitionId(definition.DefinitionId, VersionOptions.Published)
};
var createWorkflowDefinitionFilterCacheKey = _workflowDefinitionCacheManager.CreateWorkflowDefinitionFilterCacheKey(workflowDefinitionFilter);
_workflowDefinitionCacheManager.Cache.Remove(createWorkflowDefinitionFilterCacheKey);
var createWorkflowFilterCacheKey = _workflowDefinitionCacheManager.CreateWorkflowFilterCacheKey(workflowDefinitionFilter);
_workflowDefinitionCacheManager.Cache.Remove(createWorkflowFilterCacheKey);
}
finally
{
sw.Stop();
_logger.Log("End of EvictDefFromCacheAsync", name, sw.ElapsedMilliseconds, null);
}
}
#endregion
}