Reset cache
This commit is contained in:
@@ -162,10 +162,24 @@ public class WorkflowController : Controller, ILoggable
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region GetNextPossibleEvents
|
||||||
[HttpPost("GetNextPossibleEvents")]
|
[HttpPost("GetNextPossibleEvents")]
|
||||||
public async Task<ActionResult<WorkflowResponse<WorkflowModel>>> GetNextPossibleEvents(string workflowInstanceId)
|
public async Task<ActionResult<WorkflowResponse<WorkflowModel>>> GetNextPossibleEvents(string workflowInstanceId)
|
||||||
{
|
{
|
||||||
var result = await _workflowService.GetNextPossibleEventsAsync(workflowInstanceId);
|
var result = await _workflowService.GetNextPossibleEventsAsync(workflowInstanceId);
|
||||||
return Ok(result);
|
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": {
|
"ConnectionStrings": {
|
||||||
//"DefaultConnection": "Data Source=.;Initial Catalog=WfDb;User ID=sa;Password=123456;Integrated Security=false;TrustServerCertificate=True;"
|
//"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=CaspianWfDb;User Id=sa;Password=123456;TrustServerCertificate=True;"
|
||||||
//"DefaultConnection": "Server=.;Database=Workflow_Db;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=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);
|
Task<WorkflowResponse<WorkflowModel>> GetNextPossibleEventsAsync(string workflowInstanceId);
|
||||||
|
|
||||||
///// <summary>
|
/// <summary>
|
||||||
///// Evicts a workflow definition from cache (optional, commented out in service).
|
/// Evicts a workflow definition from cache (optional, commented out in service).
|
||||||
///// </summary>
|
/// </summary>
|
||||||
//Task<WorkflowResponse<WorkflowModel>> EvictDefFromCacheAsync(string definitionId);
|
Task EvictDefFromCacheAsync(string name, CancellationToken cancellationToken = default);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ public class WorkflowService : IWorkflowService, ILoggable
|
|||||||
private readonly IEventPublisher _eventPublisher;
|
private readonly IEventPublisher _eventPublisher;
|
||||||
private readonly IWorkflowDefinitionCacheManager _workflowDefinitionCacheManager;
|
private readonly IWorkflowDefinitionCacheManager _workflowDefinitionCacheManager;
|
||||||
private readonly IMdbLogger<WorkflowService> _logger;
|
private readonly IMdbLogger<WorkflowService> _logger;
|
||||||
|
|
||||||
private readonly IBookmarkStore _bookmarkStore;
|
private readonly IBookmarkStore _bookmarkStore;
|
||||||
private readonly IActivityExecutionStore _activityExecutionStore;
|
private readonly IActivityExecutionStore _activityExecutionStore;
|
||||||
#endregion
|
#endregion
|
||||||
@@ -49,9 +48,10 @@ public class WorkflowService : IWorkflowService, ILoggable
|
|||||||
_workflowInstanceManager = _serviceProvider.GetRequiredService<IWorkflowInstanceManager>();
|
_workflowInstanceManager = _serviceProvider.GetRequiredService<IWorkflowInstanceManager>();
|
||||||
_workflowInstanceStore = _serviceProvider.GetRequiredService<IWorkflowInstanceStore>();
|
_workflowInstanceStore = _serviceProvider.GetRequiredService<IWorkflowInstanceStore>();
|
||||||
_eventPublisher = _serviceProvider.GetRequiredService<IEventPublisher>();
|
_eventPublisher = _serviceProvider.GetRequiredService<IEventPublisher>();
|
||||||
_logger = logger;
|
_workflowDefinitionCacheManager = _serviceProvider.GetRequiredService<IWorkflowDefinitionCacheManager>();
|
||||||
_bookmarkStore = _serviceProvider.GetRequiredService<IBookmarkStore>();
|
_bookmarkStore = _serviceProvider.GetRequiredService<IBookmarkStore>();
|
||||||
_activityExecutionStore = _serviceProvider.GetRequiredService<IActivityExecutionStore>();
|
_activityExecutionStore = _serviceProvider.GetRequiredService<IActivityExecutionStore>();
|
||||||
|
_logger = logger;
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -136,6 +136,7 @@ public class WorkflowService : IWorkflowService, ILoggable
|
|||||||
|
|
||||||
sw.Stop();
|
sw.Stop();
|
||||||
|
|
||||||
|
|
||||||
_logger.Log("Exception occurs in CreateAndExecuteAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds, ex);
|
_logger.Log("Exception occurs in CreateAndExecuteAsync", WFInstanceId: response.Data?.InstanceId, response, sw.ElapsedMilliseconds, ex);
|
||||||
|
|
||||||
return response;
|
return response;
|
||||||
@@ -804,6 +805,7 @@ public class WorkflowService : IWorkflowService, ILoggable
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region GetNextPossibleEventsAsync
|
||||||
public async Task<WorkflowResponse<WorkflowModel>> GetNextPossibleEventsAsync(string workflowInstanceId)
|
public async Task<WorkflowResponse<WorkflowModel>> GetNextPossibleEventsAsync(string workflowInstanceId)
|
||||||
{
|
{
|
||||||
var sw = Stopwatch.StartNew();
|
var sw = Stopwatch.StartNew();
|
||||||
@@ -915,66 +917,97 @@ public class WorkflowService : IWorkflowService, ILoggable
|
|||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
//#region EvictDefFromCacheAsync
|
#region EvictDefFromCacheAsync
|
||||||
///// <inheritdoc />
|
/// <inheritdoc />
|
||||||
//public async Task<WorkflowResponse<WorkflowModel>> EvictDefFromCacheAsync(string definitionId)
|
public async Task EvictDefFromCacheAsync(string name, CancellationToken cancellationToken = default)
|
||||||
//{
|
{
|
||||||
// var sw = Stopwatch.StartNew();
|
var sw = Stopwatch.StartNew();
|
||||||
// try
|
|
||||||
// {
|
|
||||||
// _logger.Log("Start of EvictDefFromCacheAsync", definitionId);
|
|
||||||
|
|
||||||
// var key = _workflowDefinitionCacheManager.CreateWorkflowDefinitionChangeTokenKey(definitionId);
|
try
|
||||||
// await _workflowDefinitionCacheManager.EvictWorkflowDefinitionAsync(definitionId);
|
{
|
||||||
|
_logger.Log("Start of EvictDefFromCacheAsync", name);
|
||||||
|
|
||||||
// WorkflowResponse<WorkflowModel> response;
|
var defFilter = new WorkflowDefinitionFilter()
|
||||||
|
{
|
||||||
|
Name = name,
|
||||||
|
VersionOptions = VersionOptions.Published
|
||||||
|
};
|
||||||
|
|
||||||
// if (instance == null)
|
var definition = await _workflowDefinitionService
|
||||||
// {
|
.FindWorkflowDefinitionAsync(defFilter);
|
||||||
// var msg = $"Workflow instance with id '{input.WorkflowInstanceId}' not found";
|
|
||||||
// response = new WorkflowResponse<WorkflowModel>()
|
|
||||||
// {
|
|
||||||
// Status = 1,
|
|
||||||
// Message = msg,
|
|
||||||
// Data = null
|
|
||||||
// };
|
|
||||||
|
|
||||||
// sw.Stop();
|
//if (definition == null)
|
||||||
|
//{
|
||||||
|
// _logger.Log("No definition found to evict", name);
|
||||||
|
// return;
|
||||||
|
//}
|
||||||
|
|
||||||
// _logger.Log("End of InquiryStateAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds);
|
//// 1. Evict definition cache
|
||||||
|
//await _workflowDefinitionCacheManager.EvictWorkflowDefinitionAsync(definition.DefinitionId, cancellationToken);
|
||||||
|
//_logger.Log($"Definition cache evicted for definitionId '{definition.DefinitionId}'", definition.DefinitionId);
|
||||||
|
|
||||||
// return response;
|
//// 2. Re-index triggers (this rebuilds runtime cache)
|
||||||
// }
|
//await _triggerIndexer.IndexTriggersAsync(definition, cancellationToken);
|
||||||
|
//_logger.Log($"Trigger indexing completed for definitionId '{definition.DefinitionId}'", definition.DefinitionId);
|
||||||
|
|
||||||
// response = new WorkflowResponse<WorkflowModel>()
|
//var cacheKey = _workflowDefinitionCacheManager.CreateWorkflowFilterCacheKey(new WorkflowDefinitionFilter()
|
||||||
// {
|
//{
|
||||||
// Status = 0,
|
// DefinitionHandle = WorkflowDefinitionHandle.ByDefinitionId(definition.DefinitionId, VersionOptions.Published)
|
||||||
// Message = "Success",
|
//});
|
||||||
// Data = workflowModel
|
|
||||||
// };
|
|
||||||
|
|
||||||
// sw.Stop();
|
//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);
|
||||||
|
|
||||||
// _logger.Log("End of InquiryStateAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds);
|
|
||||||
|
|
||||||
// return response;
|
//Definition cache
|
||||||
// }
|
await _workflowDefinitionCacheManager.EvictWorkflowDefinitionAsync(definition.DefinitionId);
|
||||||
// catch (Exception ex)
|
|
||||||
// {
|
|
||||||
// var response = new WorkflowResponse<WorkflowModel>()
|
|
||||||
// {
|
|
||||||
// Status = 100,
|
|
||||||
// Message = ex.Message,
|
|
||||||
// Data = null
|
|
||||||
// };
|
|
||||||
|
|
||||||
// sw.Stop();
|
//Runtime Workflow Graph Cache
|
||||||
|
//await _notificationSender.SendAsync(new InvalidateWorkflowsCache());
|
||||||
|
//await _workflowDefinitionsReloader.ReloadWorkflowDefinitionsAsync();
|
||||||
|
|
||||||
// _logger.Log("Exception occurs in InquiryStateAsync", WFInstanceId: input.WorkflowInstanceId, response, sw.ElapsedMilliseconds, ex);
|
//Trigger Cache
|
||||||
|
//await _workflowDefinitionCacheManager.Cache.TriggerTokenAsync(CachingTriggerStore.CacheInvalidationTokenKey, cancellationToken);
|
||||||
|
//await _triggerIndexer.IndexTriggersAsync(definition);
|
||||||
|
|
||||||
// return response;
|
//_workflowDefinitionCacheManager.Cache.Remove("WorkflowDefinition:B0196B2A1FCF07CE8730A48F3E0238C6D8F52F7DB4C79A3C3B44A97C2BB10DB4");
|
||||||
// }
|
|
||||||
//}
|
var workflowDefinitionFilter = new WorkflowDefinitionFilter()
|
||||||
//#endregion
|
{
|
||||||
|
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
|
||||||
}
|
}
|
||||||
@@ -40,8 +40,8 @@
|
|||||||
"Sqlite": "", //"Data Source=App_Data/elsa.sqlite.db;Cache=Shared;",
|
"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=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=CaspianWfDb;User Id=sa;Password=123456;TrustServerCertificate=True;",
|
||||||
//"SqlServer": "Server=.;Database=Workflow_Db;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=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;",
|
"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",
|
"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",
|
"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;",
|
"Sqlite": "", //"Data Source=elsa.sqlite.db;Cache=Shared;",
|
||||||
"RabbitMq": "", //"rabbitmq://guest:guest@localhost:5672",
|
"RabbitMq": "", //"rabbitmq://guest:guest@localhost:5672",
|
||||||
"MySql": "", //"Server=localhost;Database=elsa;Uid=user;Pwd=password;",
|
"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"
|
"PostgreSql": "" //"Server=localhost;Username=elsa;Database=elsa;Port=5432;Password=elsa;SSLMode=Prefer;MaxPoolSize=2000;Timeout=60"
|
||||||
},
|
},
|
||||||
"DatabaseProvider": "SqlServer", //"Sqlite",
|
"DatabaseProvider": "SqlServer", //"Sqlite",
|
||||||
|
|||||||
@@ -29,4 +29,10 @@ public interface ICacheManager
|
|||||||
/// Gets an item from the cache, or creates it if it doesn't exist.
|
/// Gets an item from the cache, or creates it if it doesn't exist.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Task<TItem?> GetOrCreateAsync<TItem>(object key, Func<ICacheEntry, Task<TItem>> factory);
|
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);
|
||||||
}
|
}
|
||||||
@@ -22,10 +22,17 @@ public class CacheManager(IMemoryCache memoryCache, IChangeTokenSignaler changeT
|
|||||||
{
|
{
|
||||||
return changeTokenSignaler.TriggerTokenAsync(key, cancellationToken);
|
return changeTokenSignaler.TriggerTokenAsync(key, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public async Task<TItem?> GetOrCreateAsync<TItem>(object key, Func<ICacheEntry, Task<TItem>> factory)
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user