Reset cache

This commit is contained in:
Behzad Alizadeh
2026-04-26 19:47:19 +03:30
parent e52fb8f85c
commit 34c3d4e848
8 changed files with 122 additions and 61 deletions
@@ -162,10 +162,24 @@ public class WorkflowController : Controller, ILoggable
}
#endregion
#region GetNextPossibleEvents
[HttpPost("GetNextPossibleEvents")]
public async Task<ActionResult<WorkflowResponse<WorkflowModel>>> GetNextPossibleEvents(string workflowInstanceId)
{
var result = await _workflowService.GetNextPossibleEventsAsync(workflowInstanceId);
return Ok(result);
}
#endregion
#region ResetCache
[HttpGet("ResetCache")]
public async Task ResetCache([FromQuery] string key)
{
_logger.Log("Start of ResetCache action", key);
await _workflowService.EvictDefFromCacheAsync(key);
_logger.Log("End of ResetCache action", key);
}
#endregion
}
@@ -40,7 +40,7 @@
"ConnectionStrings": {
//"DefaultConnection": "Data Source=.;Initial Catalog=WfDb;User ID=sa;Password=123456;Integrated Security=false;TrustServerCertificate=True;"
//"DefaultConnection": "Server=.;Database=CaspianWfDb;User Id=sa;Password=123456;TrustServerCertificate=True;"
//"DefaultConnection": "Server=.;Database=Workflow_Db;User Id=sa;Password=123456;TrustServerCertificate=True;"
"DefaultConnection": "Server=192.168.251.161;Database=Workflow_Db;User Id=sa;Password=cLL{3N29D@n2;MultipleActiveResultSets=true;TrustServerCertificate=True"
"DefaultConnection": "Server=.;Database=Workflow_Db;User Id=sa;Password=123456;TrustServerCertificate=True;"
//"DefaultConnection": "Server=192.168.251.161;Database=Workflow_Db;User Id=sa;Password=cLL{3N29D@n2;MultipleActiveResultSets=true;TrustServerCertificate=True"
}
}
@@ -54,8 +54,8 @@ public interface IWorkflowService
Task<WorkflowResponse<WorkflowModel>> GetNextPossibleEventsAsync(string workflowInstanceId);
///// <summary>
///// Evicts a workflow definition from cache (optional, commented out in service).
///// </summary>
//Task<WorkflowResponse<WorkflowModel>> EvictDefFromCacheAsync(string definitionId);
/// <summary>
/// Evicts a workflow definition from cache (optional, commented out in service).
/// </summary>
Task EvictDefFromCacheAsync(string name, CancellationToken cancellationToken = default);
}
@@ -33,7 +33,6 @@ public class WorkflowService : IWorkflowService, ILoggable
private readonly IEventPublisher _eventPublisher;
private readonly IWorkflowDefinitionCacheManager _workflowDefinitionCacheManager;
private readonly IMdbLogger<WorkflowService> _logger;
private readonly IBookmarkStore _bookmarkStore;
private readonly IActivityExecutionStore _activityExecutionStore;
#endregion
@@ -49,9 +48,10 @@ public class WorkflowService : IWorkflowService, ILoggable
_workflowInstanceManager = _serviceProvider.GetRequiredService<IWorkflowInstanceManager>();
_workflowInstanceStore = _serviceProvider.GetRequiredService<IWorkflowInstanceStore>();
_eventPublisher = _serviceProvider.GetRequiredService<IEventPublisher>();
_logger = logger;
_workflowDefinitionCacheManager = _serviceProvider.GetRequiredService<IWorkflowDefinitionCacheManager>();
_bookmarkStore = _serviceProvider.GetRequiredService<IBookmarkStore>();
_activityExecutionStore = _serviceProvider.GetRequiredService<IActivityExecutionStore>();
_logger = logger;
}
#endregion
@@ -136,6 +136,7 @@ public class WorkflowService : IWorkflowService, ILoggable
sw.Stop();
_logger.Log("Exception occurs in CreateAndExecuteAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds, ex);
return response;
@@ -804,6 +805,7 @@ public class WorkflowService : IWorkflowService, ILoggable
#endregion
#region GetNextPossibleEventsAsync
public async Task<WorkflowResponse<WorkflowModel>> GetNextPossibleEventsAsync(string workflowInstanceId)
{
var sw = Stopwatch.StartNew();
@@ -915,66 +917,97 @@ public class WorkflowService : IWorkflowService, ILoggable
return null;
}
#endregion
//#region EvictDefFromCacheAsync
///// <inheritdoc />
//public async Task<WorkflowResponse<WorkflowModel>> EvictDefFromCacheAsync(string definitionId)
#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);
//if (definition == null)
//{
// var sw = Stopwatch.StartNew();
// try
// {
// _logger.Log("Start of EvictDefFromCacheAsync", definitionId);
// var key = _workflowDefinitionCacheManager.CreateWorkflowDefinitionChangeTokenKey(definitionId);
// await _workflowDefinitionCacheManager.EvictWorkflowDefinitionAsync(definitionId);
// WorkflowResponse<WorkflowModel> response;
// if (instance == null)
// {
// var msg = $"Workflow instance with id '{input.WorkflowInstanceId}' not found";
// response = new WorkflowResponse<WorkflowModel>()
// {
// Status = 1,
// Message = msg,
// Data = null
// };
// sw.Stop();
// _logger.Log("End of InquiryStateAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds);
// return response;
// }
// response = new WorkflowResponse<WorkflowModel>()
// {
// Status = 0,
// Message = "Success",
// Data = workflowModel
// };
// sw.Stop();
// _logger.Log("End of InquiryStateAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds);
// return response;
// }
// catch (Exception ex)
// {
// var response = new WorkflowResponse<WorkflowModel>()
// {
// Status = 100,
// Message = ex.Message,
// Data = null
// };
// sw.Stop();
// _logger.Log("Exception occurs in InquiryStateAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds, ex);
// return response;
// }
// _logger.Log("No definition found to evict", name);
// return;
//}
//#endregion
//// 1. Evict definition cache
//await _workflowDefinitionCacheManager.EvictWorkflowDefinitionAsync(definition.DefinitionId, cancellationToken);
//_logger.Log($"Definition cache evicted for definitionId '{definition.DefinitionId}'", definition.DefinitionId);
//// 2. Re-index triggers (this rebuilds runtime cache)
//await _triggerIndexer.IndexTriggersAsync(definition, cancellationToken);
//_logger.Log($"Trigger indexing completed for definitionId '{definition.DefinitionId}'", definition.DefinitionId);
//var cacheKey = _workflowDefinitionCacheManager.CreateWorkflowFilterCacheKey(new WorkflowDefinitionFilter()
//{
// DefinitionHandle = WorkflowDefinitionHandle.ByDefinitionId(definition.DefinitionId, VersionOptions.Published)
//});
//await workflowDefinitionCacheManager.EvictWorkflowDefinitionAsync(notification.WorkflowDefinition.DefinitionId, cancellationToken);
//var cacheKey = cacheManager.CreateWorkflowDefinitionVersionCacheKey(definitionId, versionOptions);
//var cacheKey = cacheManager.CreateWorkflowDefinitionVersionCacheKey(definitionVersionId);
//var cacheKey = cacheManager.CreateWorkflowDefinitionFilterCacheKey(filter);
//var cacheKey = cacheManager.CreateWorkflowVersionCacheKey(definitionId, versionOptions);
//var cacheKey = cacheManager.CreateWorkflowVersionCacheKey(definitionVersionId);
//Definition cache
await _workflowDefinitionCacheManager.EvictWorkflowDefinitionAsync(definition.DefinitionId);
//Runtime Workflow Graph Cache
//await _notificationSender.SendAsync(new InvalidateWorkflowsCache());
//await _workflowDefinitionsReloader.ReloadWorkflowDefinitionsAsync();
//Trigger Cache
//await _workflowDefinitionCacheManager.Cache.TriggerTokenAsync(CachingTriggerStore.CacheInvalidationTokenKey, cancellationToken);
//await _triggerIndexer.IndexTriggersAsync(definition);
//_workflowDefinitionCacheManager.Cache.Remove("WorkflowDefinition:B0196B2A1FCF07CE8730A48F3E0238C6D8F52F7DB4C79A3C3B44A97C2BB10DB4");
var workflowDefinitionFilter = new WorkflowDefinitionFilter()
{
DefinitionHandle = WorkflowDefinitionHandle.ByDefinitionId(definition.DefinitionId, VersionOptions.Published)
};
var createWorkflowDefinitionFilterCacheKey = _workflowDefinitionCacheManager.CreateWorkflowDefinitionFilterCacheKey(workflowDefinitionFilter);
_workflowDefinitionCacheManager.Cache.Remove(createWorkflowDefinitionFilterCacheKey);
//await _workflowDefinitionCacheManager.Cache.TriggerTokenAsync(createWorkflowDefinitionFilterCacheKey);
var createWorkflowFilterCacheKey = _workflowDefinitionCacheManager.CreateWorkflowFilterCacheKey(workflowDefinitionFilter);
_workflowDefinitionCacheManager.Cache.Remove(createWorkflowFilterCacheKey);
//await _workflowDefinitionCacheManager.Cache.TriggerTokenAsync(createWorkflowFilterCacheKey);
//_workflowDefinitionCacheManager.Cache.Remove("WorkflowDefinition:FAFFD28A8B17585222747A0B10C16311BCCAF7744F1C41274BBDC652356D99A6");
//_workflowDefinitionCacheManager.Cache.Remove("Workflow:FAFFD28A8B17585222747A0B10C16311BCCAF7744F1C41274BBDC652356D99A6");
//_workflowDefinitionCacheManager.Cache.Remove("WorkflowDefinition:49B1E9FD1A0244512E8D2916B0A1B880E4473AA9F4E9341F6A69D331C9843B22");
//_workflowDefinitionCacheManager.Cache.Remove("Workflow:49B1E9FD1A0244512E8D2916B0A1B880E4473AA9F4E9341F6A69D331C9843B22");
//_workflowDefinitionCacheManager.Cache.Remove("Workflow:398a80072c638a83");
}
finally
{
sw.Stop();
_logger.Log("End of EvictDefFromCacheAsync", name, sw.ElapsedMilliseconds, null);
}
}
#endregion
}
+2 -2
View File
@@ -40,8 +40,8 @@
"Sqlite": "", //"Data Source=App_Data/elsa.sqlite.db;Cache=Shared;",
//"SqlServer": "Server=localhost,1433;Initial Catalog=Elsa;User=sa;Password=!Elsa2025@;Encrypt=false;PersistSecurityInfo=false",
//"SqlServer": "Server=.;Database=CaspianWfDb;User Id=sa;Password=123456;TrustServerCertificate=True;",
//"SqlServer": "Server=.;Database=Workflow_Db;User Id=sa;Password=123456;TrustServerCertificate=True;",
"SqlServer": "Server=192.168.251.161;Database=Workflow_Db;User Id=sa;Password=cLL{3N29D@n2;MultipleActiveResultSets=true;TrustServerCertificate=True",
"SqlServer": "Server=.;Database=Workflow_Db;User Id=sa;Password=123456;TrustServerCertificate=True;",
//"SqlServer": "Server=192.168.251.161;Database=Workflow_Db;User Id=sa;Password=cLL{3N29D@n2;MultipleActiveResultSets=true;TrustServerCertificate=True",
"MySql": "", //"Server=localhost;Database=elsa;Uid=admin;Pwd=password;",
"PostgreSql": "", //"Server=localhost;Username=elsa;Database=elsa;Port=5432;Password=elsa;SSLMode=Prefer;MaxPoolSize=2000;Timeout=60",
"Citus": "", //"Server=localhost;Username=citus;Database=citus;Port=9700;Password=citus;SSLMode=Prefer;MaxPoolSize=2000;Timeout=60",
@@ -39,7 +39,8 @@
"Sqlite": "", //"Data Source=elsa.sqlite.db;Cache=Shared;",
"RabbitMq": "", //"rabbitmq://guest:guest@localhost:5672",
"MySql": "", //"Server=localhost;Database=elsa;Uid=user;Pwd=password;",
"SqlServer": "Server=.;Database=WfDb;User Id=sa;Password=123456;TrustServerCertificate=True;",
//"SqlServer": "Server=.;Database=WfDb;User Id=sa;Password=123456;TrustServerCertificate=True;",
"SqlServer": "Server=192.168.251.161;Database=Workflow_Db;User Id=sa;Password=cLL{3N29D@n2;MultipleActiveResultSets=true;TrustServerCertificate=True",
"PostgreSql": "" //"Server=localhost;Username=elsa;Database=elsa;Port=5432;Password=elsa;SSLMode=Prefer;MaxPoolSize=2000;Timeout=60"
},
"DatabaseProvider": "SqlServer", //"Sqlite",
@@ -29,4 +29,10 @@ public interface ICacheManager
/// Gets an item from the cache, or creates it if it doesn't exist.
/// </summary>
Task<TItem?> GetOrCreateAsync<TItem>(object key, Func<ICacheEntry, Task<TItem>> factory);
/// <summary>
/// remove an item from the cache
/// </summary>
/// <param name="key"></param>
void Remove(string key);
}
@@ -26,6 +26,13 @@ public class CacheManager(IMemoryCache memoryCache, IChangeTokenSignaler changeT
/// <inheritdoc />
public async Task<TItem?> GetOrCreateAsync<TItem>(object key, Func<ICacheEntry, Task<TItem>> factory)
{
return await memoryCache.GetOrCreateAsync(key, async entry => await factory(entry));
var result = await memoryCache.GetOrCreateAsync(key, async entry => await factory(entry));
return result;
}
/// <inheritdoc />
public void Remove(string key)
{
memoryCache.Remove(key);
}
}