/// <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); }
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"); }
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"); }
/// <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); } }
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); }
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"); }
// 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); }
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)); }