/// <summary> /// 在 Redis 服务器中添加一个订阅方法。 /// </summary> /// <typeparam name="TSubject"></typeparam> /// <param name="subscriber">读取主题的方法。</param> public void AddAsyncSubscriber <TSubject>(Func <TSubject, Task> subscriber) where TSubject : class { var client = GetConnection(); var name = TopicHelper.GetTopicName(typeof(TSubject)); AddAsyncSubscriber <TSubject>(name, subscriber); }
/// <summary> /// 向 Rabbit 服务器发送消息主题。 /// </summary> /// <typeparam name="TSubject"></typeparam> /// <param name="subject">主题内容。</param> public void Publish <TSubject>(TSubject subject) where TSubject : class { var name = TopicHelper.GetTopicName(typeof(TSubject)); var data = Serialize(subject); Publish(name, data); }
/// <summary> /// 在 Redis 服务器中添加一个订阅方法。 /// </summary> /// <param name="subjectType">主题的类型。</param> /// <param name="subscriber">读取主题的方法。</param> public void AddSubscriber(Type subjectType, Delegate subscriber) { var client = GetConnection(); var name = TopicHelper.GetTopicName(subjectType); _channels.GetOrAdd(name, () => new List <CSRedisClient.SubscribeObject>()) .Add(client.Subscribe((name, msg => { StoredSubject subject = null; try { try { subject = Deserialize <StoredSubject>(msg.Body); subscriber.DynamicInvoke(Deserialize(subjectType, subject.Body)); } catch (SerializationException) { subscriber.DynamicInvoke(Deserialize(subjectType, msg.Body)); } } catch (Exception exp) { Tracer.Error($"Throw exception when consume message of '{name}':\n{exp.Output()}"); RetryPublishData(subject, exp); } } ))); }
/// <summary> /// 移除相关的订阅方法。 /// </summary> /// <param name="subjectType">主题的类型。</param> public void RemoveSubscriber(Type subjectType) { var client = GetConnection(); var channelName = TopicHelper.GetTopicName(subjectType); RemoveSubscriber(channelName); }
/// <summary> /// 在 Redis 服务器中添加一个订阅方法。 /// </summary> /// <param name="subjectType">主题的类型。</param> /// <param name="subscriber">读取主题的方法。</param> public void AddSubscriber(Type subjectType, Delegate subscriber) { var client = GetConnection(); var name = TopicHelper.GetTopicName(subjectType); #if NETSTANDARD channels.GetOrAdd(name, () => new List <CSRedisClient.SubscribeObject>()) .Add(client.Subscribe((name, msg => { var subject = Deserialize(subjectType, msg.Body); if (subject != null) { subscriber.DynamicInvoke(subject); } } ))); #else client.GetSubscriber().Subscribe(name, (channel, value) => { var subject = Deserialize(subjectType, Encoding.UTF8.GetString(value)); if (subject != null) { subscriber.DynamicInvoke(subject); } }); #endif }
/// <summary> /// 移除相关的订阅方法。 /// </summary> /// <param name="subjectType">主题的类型。</param> public void RemoveSubscriber(Type subjectType) { Guard.ArgumentNull(subjectType, nameof(subjectType)); var channelName = TopicHelper.GetTopicName(subjectType); RemoveSubscriber(channelName); }
/// <summary> /// 在 Rabbit 服务器中添加一个异步的订阅方法。 /// </summary> /// <typeparam name="TSubject"></typeparam> /// <param name="subscriber">读取主题的方法。</param> public void AddAsyncSubscriber <TSubject>(Func <TSubject, Task> subscriber) where TSubject : class { Guard.ArgumentNull(subscriber, nameof(subscriber)); var name = TopicHelper.GetTopicName(typeof(TSubject)); AddAsyncSubscriber <TSubject>(name, subscriber); }
/// <summary> /// 向 Redis 服务器发送消息主题。 /// </summary> /// <typeparam name="TSubject"></typeparam> /// <param name="subject">主题内容。</param> public void Publish <TSubject>(TSubject subject) where TSubject : class { var client = GetConnection(null); var name = TopicHelper.GetTopicName(typeof(TSubject)); var body = SerializeToBytes(subject); Publish(client, name, body); }
/// <summary> /// 在 Rabbit 服务器中添加一个订阅方法。 /// </summary> /// <param name="subjectType">主题的类型。</param> /// <param name="subscriber">读取主题的方法。</param> public void AddSubscriber(Type subjectType, Delegate subscriber) { Guard.ArgumentNull(subjectType, nameof(subjectType)); Guard.ArgumentNull(subscriber, nameof(subscriber)); var name = TopicHelper.GetTopicName(subjectType); var list = _subscribers.GetOrAdd(name, () => new RabbitChannelCollection()); list.Add(new RabbitChannel(new SyncSubscribeDelegate(subjectType, subscriber), CreateAliveModel(name))); }
/// <summary> /// 在 Rabbit 服务器中添加一个订阅方法。 /// </summary> /// <param name="subjectType">主题的类型。</param> /// <param name="subscriber">读取主题的方法。</param> public void AddSubscriber(Type subjectType, Delegate subscriber) { Guard.ArgumentNull(subjectType, nameof(subjectType)); Guard.ArgumentNull(subscriber, nameof(subscriber)); var name = TopicHelper.GetTopicName(subjectType); var list = subscribers.GetOrAdd(name, () => new RabbitChannelCollection()); list.Add(new RabbitChannel(subscriber, StartQueue(name))); }
/// <summary> /// 异步的,向 Redis 服务器发送消息主题。 /// </summary> /// <typeparam name="TSubject"></typeparam> /// <param name="subject">主题内容。</param> /// <param name="cancellationToken">取消操作的通知。</param> public async Task PublishAsync <TSubject>(TSubject subject, CancellationToken cancellationToken = default) where TSubject : class { cancellationToken.ThrowIfCancellationRequested(); var client = GetConnection(null); var name = TopicHelper.GetTopicName(typeof(TSubject)); var body = SerializeToBytes(subject); await PublishAsync(client, name, body); }
/// <summary> /// 异步的,向 Redis 服务器发送消息主题。 /// </summary> /// <typeparam name="TSubject"></typeparam> /// <param name="subject">主题内容。</param> /// <param name="cancellationToken">取消操作的通知。</param> public async Task PublishAsync <TSubject>(TSubject subject, CancellationToken cancellationToken = default) where TSubject : class { #if NETSTANDARD var client = GetConnection(); var name = TopicHelper.GetTopicName(typeof(TSubject)); await client.PublishAsync(name, Serialize(subject)); #else var data = Encoding.UTF8.GetBytes(Serialize(subject)); var name = TopicHelper.GetTopicName(typeof(TSubject)); Publish(name, data); #endif }
/// <summary> /// 向 Redis 服务器发送消息主题。 /// </summary> /// <typeparam name="TSubject"></typeparam> /// <param name="subject">主题内容。</param> public void Publish <TSubject>(TSubject subject) where TSubject : class { #if NETSTANDARD var client = GetConnection(); var name = TopicHelper.GetTopicName(typeof(TSubject)); client.Publish(name, Serialize(subject)); #else var data = Encoding.UTF8.GetBytes(Serialize(subject)); var name = TopicHelper.GetTopicName(typeof(TSubject)); Publish(name, data); #endif }
/// <summary> /// 在 Redis 服务器中添加一个订阅方法。 /// </summary> /// <typeparam name="TSubject"></typeparam> /// <param name="subscriber">读取主题的方法。</param> public void AddSubscriber <TSubject>(Action <TSubject> subscriber) where TSubject : class { var client = GetConnection(); var name = TopicHelper.GetTopicName(typeof(TSubject)); #if NETSTANDARD channels.GetOrAdd(name, () => new List <CSRedisClient.SubscribeObject>()) .Add(client.Subscribe((name, msg => { var subject = Deserialize <TSubject>(msg.Body); subscriber(subject); } ))); #else client.GetSubscriber().Subscribe(name, (channel, value) => { var subject = Deserialize <TSubject>(Encoding.UTF8.GetString(value)); subscriber(subject); }); #endif }
public async Task PublishAsync <TSubject>(TSubject subject, CancellationToken cancellationToken = default) where TSubject : class { var name = TopicHelper.GetTopicName(typeof(TSubject)); await PublishAsync(name, subject, cancellationToken); }
public void Publish <TSubject>(TSubject subject) where TSubject : class { var name = TopicHelper.GetTopicName(typeof(TSubject)); Publish(name, subject); }