internal void Resubscribe(RedisChannel channel, ServerEndPoint server) { if (server != null && Interlocked.CompareExchange(ref owner, server, server) == server) { var cmd = channel.Contains((byte)'*') ? RedisCommand.PSUBSCRIBE : RedisCommand.SUBSCRIBE; var msg = Message.Create(-1, CommandFlags.FireAndForget, cmd, channel); msg.SetInternalCall(); server.QueueDirectFireAndForget(msg, ResultProcessor.TrackSubscriptions); } }
public Task SubscribeToServer(ConnectionMultiplexer multiplexer, RedisChannel channel, CommandFlags flags, object asyncState, bool internalCall) { var cmd = channel.Contains((byte)'*') ? RedisCommand.PSUBSCRIBE : RedisCommand.SUBSCRIBE; var selected = multiplexer.SelectServer(-1, cmd, CommandFlags.DemandMaster, default(RedisKey)); if (selected == null || Interlocked.CompareExchange(ref owner, selected, null) != null) { return(null); } var msg = Message.Create(-1, flags, cmd, channel); return(selected.QueueDirectAsync(msg, ResultProcessor.TrackSubscriptions, asyncState)); }
public Task UnsubscribeFromServer(RedisChannel channel, CommandFlags flags, object asyncState, bool internalCall) { var oldOwner = Interlocked.Exchange(ref owner, null); if (oldOwner == null) { return(null); } var cmd = channel.Contains((byte)'*') ? RedisCommand.PUNSUBSCRIBE : RedisCommand.UNSUBSCRIBE; var msg = Message.Create(-1, flags, cmd, channel); if (internalCall) { msg.SetInternalCall(); } return(oldOwner.QueueDirectAsync(msg, ResultProcessor.TrackSubscriptions, asyncState)); }