Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
        /// <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);
                }
            }
                                   )));
        }
Beispiel #4
0
        /// <summary>
        /// 移除相关的订阅方法。
        /// </summary>
        /// <param name="subjectType">主题的类型。</param>
        public void RemoveSubscriber(Type subjectType)
        {
            var client      = GetConnection();
            var channelName = TopicHelper.GetTopicName(subjectType);

            RemoveSubscriber(channelName);
        }
Beispiel #5
0
        /// <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
        }
Beispiel #6
0
        /// <summary>
        /// 移除相关的订阅方法。
        /// </summary>
        /// <param name="subjectType">主题的类型。</param>
        public void RemoveSubscriber(Type subjectType)
        {
            Guard.ArgumentNull(subjectType, nameof(subjectType));

            var channelName = TopicHelper.GetTopicName(subjectType);

            RemoveSubscriber(channelName);
        }
Beispiel #7
0
        /// <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);
        }
Beispiel #8
0
        /// <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);
        }
Beispiel #9
0
        /// <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)));
        }
Beispiel #10
0
        /// <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)));
        }
Beispiel #11
0
        /// <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);
        }
Beispiel #12
0
        /// <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
        }
Beispiel #13
0
        /// <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
        }
Beispiel #14
0
        /// <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
        }
Beispiel #15
0
        public async Task PublishAsync <TSubject>(TSubject subject, CancellationToken cancellationToken = default) where TSubject : class
        {
            var name = TopicHelper.GetTopicName(typeof(TSubject));

            await PublishAsync(name, subject, cancellationToken);
        }
Beispiel #16
0
        public void Publish <TSubject>(TSubject subject) where TSubject : class
        {
            var name = TopicHelper.GetTopicName(typeof(TSubject));

            Publish(name, subject);
        }