Using distributed locks
This section provides information on how to acquire distributed locks in a command.
API reference:
Required scopes:
Data/Buildby.Taskurai/locks/createData/Buildby.Taskurai/locks/readData/Buildby.Taskurai/locks/delete
Prerequisites
- You have completed the setup of a worker in Taskurai, see Workers and Commands.
Acquiring a lock in a command
In this example, a lock is acquired with id EuSalesLock for the owner SalesCollector.CollectEUSales with a lease time of 2 minutes, the call will wait 30 seconds to acquire a lock. If the call fails, an exception will be thrown.
- C#
[Command]
public async Task<double> CollectEUSales(TaskuraiTaskContext context, CancellationToken cancellationToken, string country)
{
await using (var distributedLock = await context.AcquireLockAsync(
lockId: "EuSalesLock",
owner: "SalesCollector.CollectEUSales",
ttl: TimeSpan.FromMinutes(2),
timeout: TimeSpan.FromSeconds(30)))
{
// Check if task may start after acquiring lock
context.CheckTaskExpired();
// Throw if lock is expired.
distributedLock.ThrowIfLockExpired();
}
}
Expiration status
When using the notStartAfter setting in the task execution options in combination with distributed locks, it is recommended to check the expiration status using CheckTaskExpired after acquiring the lock.
- C#
// Check if task may start after acquiring lock
context.CheckTaskExpired();
Checking lock lease
When running long operations is a lock, it is required to check if the lock lease is still active using the IsLocked(), IsLockedAsync() or ThrowIfLockExpired() methods on TaskuraiDistributedLock class.
- C#
// Throw if lock is expired.
distributedLock.ThrowIfLockExpired();