Pub/Sub двигателят, захранващ Redis ServerEvents и Redis MQ, е извлечен и капсулиран в клас за повторно използване, който може да се използва независимо за обработка на съобщения, публикувани в конкретни Redis Pub/Sub канали.
RedisPubSubServer
обработва съобщения в управлявана фонова нишка, която автоматично се свързва отново когато връзката с redis-сървър се провали и работи като независима фонова услуга, която може да бъде спряна и стартирана по команда.
Публичният API се улавя в интерфейса IRedisPubSubServer:
public interface IRedisPubSubServer : IDisposable
{
IRedisClientsManager ClientsManager { get; }
// What Channels it's subscribed to
string[] Channels { get; }
// Run once on initial StartUp
Action OnInit { get; set; }
// Called each time a new Connection is Started
Action OnStart { get; set; }
// Invoked when Connection is broken or Stopped
Action OnStop { get; set; }
// Invoked after Dispose()
Action OnDispose { get; set; }
// Fired when each message is received
Action<string, string> OnMessage { get; set; }
// Fired after successfully subscribing to the specified channels
Action<string> OnUnSubscribe { get; set; }
// Called when an exception occurs
Action<Exception> OnError { get; set; }
// Called before attempting to Failover to a new redis master
Action<IRedisPubSubServer> OnFailover { get; set; }
int? KeepAliveRetryAfterMs { get; set; }
// The Current Time for RedisServer
DateTime CurrentServerTime { get; }
// Current Status: Starting, Started, Stopping, Stopped, Disposed
string GetStatus();
// Different life-cycle stats
string GetStatsDescription();
// Subscribe to specified Channels and listening for new messages
IRedisPubSubServer Start();
// Close active Connection and stop running background thread
void Stop();
// Stop than Start
void Restart();
}
Използване №
За да използвате RedisPubSubServer
, инициализирайте го с каналите, за които искате да се абонирате, и задайте манипулатори за всяко от събитията, които искате да обработвате. Като минимум ще искате да обработвате OnMessage
:
var clientsManager = new PooledRedisClientManager();
var redisPubSub = new RedisPubSubServer(clientsManager, "channel-1", "channel-2") {
OnMessage = (channel, msg) => "Received '{0}' from '{1}'".Print(msg, channel)
}.Start();
Извикване на Start()
след като бъде инициализиран, ще го накара да започне да слуша и обработва всички съобщения, публикувани в абонираните канали.