Upgrade packages for reset cache
This commit is contained in:
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user