/// <summary>
        ///     创建一个数据订阅者,并且订阅到远程SAPS上
        /// </summary>
        /// <typeparam name="K">Key类型</typeparam>
        /// <typeparam name="V">Value类型</typeparam>
        /// <param name="catalog">SAPS上的分类</param>
        /// <param name="iep">远程地址</param>
        /// <param name="callback">回调函数</param>
        /// <param name="isAutoReconnect">连接断开后的重连标识</param>
        /// <returns>返回订阅后的状态</returns>
        public IRemoteDataSubscriber <K, V> Regist <K, V>(string catalog, string iep, EventHandler <LightSingleArgEventArgs <DataRecvEventArgs <K, V> > > callback, bool isAutoReconnect = false)
        {
            if (string.IsNullOrEmpty(catalog))
            {
                throw new ArgumentNullException("catalog");
            }
            if (callback == null)
            {
                throw new ArgumentNullException("callback");
            }
            IRemoteDataSubscriber <K, V> subscriber = DataSubscriberFactory.Instance.Create <K, V>(catalog, new NetworkResource(iep), isAutoReconnect);

            if (subscriber == null)
            {
                throw new Exception("#Cannot regist remote data subscriber to SAPS. #iep: " + iep);
            }
            SubscriberState state = subscriber.Open();

            if (state != SubscriberState.Subscribed && !isAutoReconnect)
            {
                throw new Exception("#Cannot regist remote data subscriber to SAPS. #iep: " + iep);
            }
            subscriber.MessageRecv += callback;
            return(subscriber);
        }
Пример #2
0
        public void AddMultiLevelWildcard()
        {
            // Arrange
            var topicBuilder    = new TopicBuilder(TopicConsumer.Subscriber);
            var subscriberState = new SubscriberState(topicBuilder);

            // Act
            Action addingMultiLevelWildcard = () =>
                                              subscriberState.AddMultiLevelWildcard();

            // Assert
            addingMultiLevelWildcard.Should()
            .NotThrow <MqttBaseException>(
                "because adding a wildcard is allowed when subscribing");
        }
Пример #3
0
        public void AddTopic()
        {
            // Arrange
            var topicBuilder    = new TopicBuilder(TopicConsumer.Subscriber);
            var subscriberState = new SubscriberState(topicBuilder);

            var topic = TestUtils.GenerateSingleValidTopic();

            // Act
            Action addingMultiLevelWildcard = () =>
                                              subscriberState.AddTopic(topic);

            // Assert
            addingMultiLevelWildcard.Should()
            .NotThrow <MqttBaseException>(
                "because adding a topic should be allowed on subscribe");
        }
Пример #4
0
        /// <summary>
        /// Adds the specified provider.
        /// </summary>
        /// <param name="providerNameOrGuid">The provider name or Guid.</param>
        /// <exception cref="ArgumentException">
        /// The specified provider has already been registered.
        /// </exception>
        public void RegistProvider(string providerNameOrGuid)
        {
            lock (m_Subscribers)
            {
                if (m_Subscribers.ContainsKey(providerNameOrGuid))
                {
                    throw new ArgumentException("The specified provider has already been registered.");
                }

                IObservable <TraceEvent> target = EtwStream.ObservableEventListener.FromTraceEvent(providerNameOrGuid);

                IDisposable subscriber = target.Subscribe(this);

                SubscriberState state = new SubscriberState(providerNameOrGuid, subscriber);

                m_Subscribers.Add(providerNameOrGuid, state);
            }
        }
Пример #5
0
        public SubscriberState NewSubscriber(CmdArgsNewSub args)
        {
            var ops = GetOperations();
            var sub = args.Id;
            var publicUpdateNotifyUri  = new Uri(args.PublicUpdateNotifyUrl, UriKind.Absolute);
            var privateUpdateNotifyUri = !String.IsNullOrEmpty(args.PrivateUpdateNotifyUrl) ? new Uri(args.PrivateUpdateNotifyUrl, UriKind.Absolute) : null;

            var init = new SubscriberState()
            {
                Id = args.Id,
                PrivateUpdateNotifyUri = privateUpdateNotifyUri,
                PublicUpdateNotifyUri  = publicUpdateNotifyUri,
                SubscribedToPublisher  = Config.DefaultPublisherId
            };

            if (!ops.CreateSubscriber(init))
            {
                return(null);
            }
            return(init);
        }
Пример #6
0
        public void AddTopics()
        {
            // Arrange
            var topicBuilder    = new TopicBuilder(TopicConsumer.Subscriber);
            var subscriberState = new SubscriberState(topicBuilder);

            var count  = Fixture.Create <int>() % Mqtt.Topic.MaximumAllowedLevels;
            var topics = new Queue <string>();

            for (var i = 0; i < count; ++i)
            {
                topics.Enqueue(TestUtils.GenerateSingleValidTopic());
            }

            // Act
            Action addingMultiLevelWildcard = () =>
                                              subscriberState.AddTopics(topics);

            // Assert
            addingMultiLevelWildcard.Should()
            .NotThrow <MqttBaseException>(
                "because adding a topic should be allowed on subscribe");
        }
Пример #7
0
        // make a real request to warm up the site as well
        // fire and forget
        private static void WarmupSite(SubscriberState sub)
        {
            var client = new HttpClient();

            client.GetAsync(sub.PublicUpdateNotifyUri);
        }
Пример #8
0
        private async Task <KeyValuePair <SubscriberState, HttpStatusCode> > PingNotifyAll(SubscriberState sub)
        {
            var rsp = await KuduCalfWeb.Protocol.KuduCalfWebUpdateNotifyAllAsync(sub.PublicUpdateNotifyUri);

            HttpStatusCode statusCode = HttpStatusCode.Unused;

            statusCode = rsp.StatusCode;
            WarmupSite(sub);
            return(new KeyValuePair <SubscriberState, HttpStatusCode>(sub, statusCode));
        }