Release distributed lock
This commit is contained in:
parent
0f8d6b6442
commit
409bf36e7e
|
|
@ -1,4 +1,6 @@
|
|||
using System.Threading.Tasks;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Threading.Tasks;
|
||||
using Elsa.DistributedLock;
|
||||
using Elsa.Models;
|
||||
using Elsa.Persistence;
|
||||
|
|
@ -16,6 +18,7 @@ namespace Elsa.Activities.Timers.Quartz.Jobs
|
|||
private readonly IWorkflowQueue _workflowQueue;
|
||||
private readonly IDistributedLockProvider _distributedLockProvider;
|
||||
private readonly ILogger _logger;
|
||||
private Stopwatch _stopwatch = new();
|
||||
|
||||
public RunQuartzWorkflowJob(
|
||||
IWorkflowRegistry workflowRegistry,
|
||||
|
|
@ -41,22 +44,36 @@ namespace Elsa.Activities.Timers.Quartz.Jobs
|
|||
var activityId = dataMap.GetString("ActivityId")!;
|
||||
var lockKey = (workflowInstanceId, workflowDefinitionId, activityId).GetHashCode().ToString();
|
||||
|
||||
_logger.LogDebug("Acquiring lock on {WorkflowInstanceId} / {WorkflowDefinitionId} / {ActivityId}", workflowInstanceId, workflowDefinitionId, activityId);
|
||||
|
||||
if (!await _distributedLockProvider.AcquireLockAsync(lockKey, cancellationToken))
|
||||
{
|
||||
_logger.LogDebug("Failed to acquire lock on {WorkflowInstanceId} / {WorkflowDefinitionId} / {ActivityId}", workflowInstanceId, workflowDefinitionId, activityId);
|
||||
return;
|
||||
}
|
||||
|
||||
var workflowBlueprint = (await _workflowRegistry.GetWorkflowAsync(workflowDefinitionId, tenantId, VersionOptions.Published, cancellationToken))!;
|
||||
_stopwatch.Restart();
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
var workflowBlueprint = (await _workflowRegistry.GetWorkflowAsync(workflowDefinitionId, tenantId, VersionOptions.Published, cancellationToken))!;
|
||||
|
||||
if (workflowInstanceId == null)
|
||||
{
|
||||
if (workflowBlueprint.IsSingleton || await GetWorkflowIsAlreadyExecutingAsync(tenantId, workflowDefinitionId) == false)
|
||||
await _workflowQueue.EnqueueWorkflowDefinition(workflowDefinitionId, tenantId, activityId, null, null, null, cancellationToken);
|
||||
if (workflowInstanceId == null)
|
||||
{
|
||||
if (workflowBlueprint.IsSingleton || await GetWorkflowIsAlreadyExecutingAsync(tenantId, workflowDefinitionId) == false)
|
||||
await _workflowQueue.EnqueueWorkflowDefinition(workflowDefinitionId, tenantId, activityId, null, null, null, cancellationToken);
|
||||
}
|
||||
else
|
||||
{
|
||||
await _workflowQueue.EnqueueWorkflowInstance(workflowInstanceId, activityId, null, cancellationToken);
|
||||
}
|
||||
}
|
||||
else
|
||||
finally
|
||||
{
|
||||
await _workflowQueue.EnqueueWorkflowInstance(workflowInstanceId, activityId, null, cancellationToken);
|
||||
_stopwatch.Stop();
|
||||
await _distributedLockProvider.ReleaseLockAsync(lockKey, cancellationToken);
|
||||
_logger.LogDebug("Held lock on {WorkflowInstanceId} / {WorkflowDefinitionId} / {ActivityId} for {LockTime}.", workflowInstanceId, workflowDefinitionId, activityId, _stopwatch.Elapsed);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue