Пример #1
0
        private void OnRemove()
        {
            var remove = SelectedConsumer;

            Consumers.Remove(remove);
            SHES.devicesList.Remove(remove);
            SHES.importer.SerializeObject <ObservableCollection <Consumers> >(Consumers, "../../ConfigFiles/ConsumersConfig.xml");
        }
Пример #2
0
        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);
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        /// <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);
        }