public void UnLock() { ZkLockerManager.GetClient().deleteAsync(_currentNode).Wait(); MessageManager <Null> .DeleteSubject(_currentNode); _observer.OnCompleted(); _event.Dispose(); }
private async Task <bool> ExistPreNodeExecuted() { var result = await ZkLockerManager.GetClient().getChildrenAsync($"/locks/{_lockName}"); var children = result.Children.OrderBy(item => int.Parse(Regex.Replace(item, @"[a-zA-Z|_]", "0"))).ToList(); var currentIndex = children.IndexOf(_currentNode.Replace($"/locks/{_lockName}/", "")); if (currentIndex <= 0) { return(false); } return(true); }
public override async Task process(WatchedEvent @event) { if (@event.get_Type() == Event.EventType.NodeDeleted) { var result = await ZkLockerManager.GetClient() .getChildrenAsync(@event.getPath().Substring(0, @event.getPath().LastIndexOf('/'))); var children = result.Children.OrderBy(item => int.Parse(Regex.Replace(item, @"[a-zA-Z|_]", "0"))).ToList(); if (children.Count > 0) { MessageManager <Null> .Publish( @event.getPath().Substring(0, @event.getPath().LastIndexOf('/') + 1) + children[0], new Null()); } } }
public Locker(string lockName, int timeout) { if (ZkLockerManager.GetClient().existsAsync("/locks").Result == null) { ZkLockerManager.GetClient().createAsync("/locks", new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT).Wait(); } if (ZkLockerManager.GetClient().existsAsync("/locks/" + lockName).Result == null) { ZkLockerManager.GetClient().createAsync("/locks/" + lockName, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT).Wait(); } _lockName = lockName; _lockTimeout = timeout; _observer = Observer.Create <Null>(_ => { ReceiveMessage(); }); }
public void Lock() { _currentNode = ZkLockerManager.GetClient().createAsync($"/locks/{_lockName}/node", new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL).Result; ZkLockerManager.GetClient().existsAsync(_currentNode, true); if (ExistPreNodeExecuted().Result) { MessageManager <Null> .Subscribe(_currentNode, _observer); var result = WaitHandle.WaitAny(new WaitHandle[] { _event }, TimeSpan.FromMilliseconds(_lockTimeout)); if (result == WaitHandle.WaitTimeout || result == 1) { UnLock(); throw new LockerTimeoutException(); } } }