acquire method
Attempts to claim uniqueness for envelope using options.
Implementation
Future<UniqueTaskClaim> acquire({
required Envelope envelope,
required TaskOptions options,
}) async {
final ttl = _resolveTtl(options, envelope);
final uniqueKey = _resolveUniqueKey(envelope);
final owner = envelope.id;
final lockKey = _lockKey(uniqueKey);
final lock = await lockStore.acquire(lockKey, ttl: ttl, owner: owner);
if (lock != null) {
return UniqueTaskClaim._(
uniqueKey: uniqueKey,
owner: owner,
ttl: ttl,
status: UniqueTaskClaimStatus.acquired,
);
}
final existingOwner = await lockStore.ownerOf(lockKey);
if (existingOwner == null) {
// Retry once in case the previous owner expired between calls.
final retryLock = await lockStore.acquire(
lockKey,
ttl: ttl,
owner: owner,
);
if (retryLock != null) {
return UniqueTaskClaim._(
uniqueKey: uniqueKey,
owner: owner,
ttl: ttl,
status: UniqueTaskClaimStatus.acquired,
);
}
final retryOwner = await lockStore.ownerOf(lockKey);
return UniqueTaskClaim._(
uniqueKey: uniqueKey,
owner: owner,
ttl: ttl,
status: UniqueTaskClaimStatus.duplicate,
existingTaskId: retryOwner,
);
}
return UniqueTaskClaim._(
uniqueKey: uniqueKey,
owner: owner,
ttl: ttl,
status: UniqueTaskClaimStatus.duplicate,
existingTaskId: existingOwner,
);
}