private void OnRemove() { var remove = SelectedConsumer; Consumers.Remove(remove); SHES.devicesList.Remove(remove); SHES.importer.SerializeObject <ObservableCollection <Consumers> >(Consumers, "../../ConfigFiles/ConsumersConfig.xml"); }
private void Start() { controlTask = Task.Factory.StartNew( () => { if (State == DispatcherState.DS_AWAITING || State == DispatcherState.DS_STOPPED) { State = DispatcherState.DS_RUNNING; logger.Info("Dispatcher: Dispatcher starting"); Consumers.Each((consumer) => consumer.Open()); Consumers.Select(consumer => consumer.Job).Each(job => tasks.Add(job)); logger.InfoFormat("Dispatcher: Dispatcher starting {0} performers", tasks.Count); while (tasks.Any()) { try { var index = Task.WaitAny(tasks.ToArray()); logger.DebugFormat("Dispatcher: Performer stopped with state {0}", tasks[index].Status); var consumer = Consumers.SingleOrDefault(c => c.JobId == tasks[index].Id); if (consumer != null) { logger.DebugFormat("Dispatcher: Removing a consumer with connection name {0}", consumer.Name); consumer.Dispose(); Consumers.Remove(consumer); } tasks[index].Dispose(); tasks.RemoveAt(index); } catch (AggregateException ae) { ae.Handle( (ex) => { logger.ErrorFormat("Dispatcher: Error on consumer; consumer shut down"); return(true); }); } } State = DispatcherState.DS_STOPPED; logger.Info("Dispatcher: Dispatcher stopped"); } }, TaskCreationOptions.LongRunning); }
/// <summary>取消订阅</summary> /// <param name="user">订阅者</param> /// <param name="userState">订阅者</param> /// <returns></returns> public Boolean Remove(String user, Object userState) { //if (!Consumers.Remove(user)) return false; if (!Consumers.TryGetValue(user, out var cs)) { return(false); } var rs = cs.Remove(userState); // 如果没有订阅者,则删除消费者 if (rs && cs.Subscribers.IsEmpty) { Consumers.Remove(user); } return(rs); }
public virtual IMessageProvider Register(MessageKind[] kinds) { if (kinds == null || kinds.Length < 1) { throw new ArgumentNullException("kinds"); } kinds = kinds.Distinct().OrderBy(e => e).ToArray(); if (kinds == null || kinds.Length < 1) { throw new ArgumentNullException("kinds"); } // 检查注册范围是否有效 var ks = Kinds; if (ks != null) { foreach (var item in kinds) { if (Array.IndexOf <MessageKind>(ks, item) < 0) { throw new ArgumentOutOfRangeException("kinds", "当前消息提供者不支持Kind=" + item + "的消息!"); } } } var mc = new MessageConsumer() { Parent = this, Kinds = kinds }; lock (Consumers) { Consumers.Add(mc); } mc.OnDisposed += (s, e) => Consumers.Remove(s as MessageConsumer); return(mc); }
/// <summary> /// Create a Consumer. /// </summary> /// <param name="consumerOptions"></param> /// <returns></returns> public override async Task <Consumer> ConsumeAsync(ConsumerOptions consumerOptions) { _logger.LogDebug("ConsumeAsync()"); if (consumerOptions.ProducerId.IsNullOrWhiteSpace()) { throw new Exception("missing producerId"); } var producer = GetProducerById(consumerOptions.ProducerId); if (producer == null) { throw new Exception($"Producer with id {consumerOptions.ProducerId} not found"); } // This may throw. var rtpParameters = ORTC.GetPipeConsumerRtpParameters(producer.ConsumableRtpParameters, Rtx); var @internal = new ConsumerInternalData ( Internal.RouterId, Internal.TransportId, consumerOptions.ProducerId, Guid.NewGuid().ToString() ); var reqData = new { producer.Kind, RtpParameters = rtpParameters, Type = ConsumerType.Pipe, ConsumableRtpEncodings = producer.ConsumableRtpParameters.Encodings, }; var status = await Channel.RequestAsync(MethodId.TRANSPORT_CONSUME, @internal, reqData); var responseData = JsonConvert.DeserializeObject <TransportConsumeResponseData>(status !); var data = new { producer.Kind, RtpParameters = rtpParameters, Type = ConsumerType.Pipe, }; // 在 Node.js 实现中, 创建 Consumer 对象时没提供 score 和 preferredLayers 参数,且 score = { score: 10, producerScore: 10 }。 var consumer = new Consumer(_loggerFactory, @internal, data.Kind, data.RtpParameters, data.Type, Channel, AppData, responseData.Paused, responseData.ProducerPaused, responseData.Score, responseData.PreferredLayers); Consumers[consumer.Internal.ConsumerId] = consumer; consumer.On("@close", _ => Consumers.Remove(consumer.Internal.ConsumerId)); consumer.On("@producerclose", _ => Consumers.Remove(consumer.Internal.ConsumerId)); // Emit observer event. Observer.Emit("newconsumer", consumer); return(consumer); }