Subscriber.cs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using StackExchange.Redis;
  2. using System;
  3. using VCommon.Logging;
  4. using VCommon.Services;
  5. namespace VCommon.PubSub
  6. {
  7. public abstract class Subscriber : PubSubBase, IService
  8. {
  9. protected Subscriber(string server, string channelName) : base(server, channelName)
  10. {
  11. }
  12. private void OnMessageArrival(RedisChannel channel, RedisValue content)
  13. {
  14. Logger.Trace($"{nameof(PubSub)}:{nameof(Subscriber)} Event", new { ChannelName, Content = (string)content });
  15. try
  16. {
  17. HandleEvent(content);
  18. }
  19. catch (Exception exception)
  20. {
  21. Logger.Error($"{nameof(PubSub)}:{nameof(Subscriber)} Error on handling event", new { ChannelName, exception });
  22. }
  23. }
  24. public override void Dispose()
  25. {
  26. Stop();
  27. base.Dispose();
  28. }
  29. protected abstract void HandleEvent(string message);
  30. public void Start()
  31. {
  32. Logger.Trace($"{nameof(PubSub)}:{nameof(Subscriber)} Start", ChannelName);
  33. Conn.GetSubscriber().Subscribe(ChannelName, OnMessageArrival);
  34. }
  35. public void Stop()
  36. {
  37. Logger.Trace($"{nameof(PubSub)}:{nameof(Subscriber)} Stop", ChannelName);
  38. Conn.GetSubscriber().Unsubscribe(ChannelName, OnMessageArrival);
  39. }
  40. }
  41. }