Пример #1
0
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
//ORIGINAL LINE: public void subscribe(String host, int port, String tableName, MessageHandler handler, long offset) throws java.io.IOException
        public virtual void subscribe(string host, int port, string tableName, MessageHandler handler, long offset)
        {
            BlockingQueue <IList <IMessage> > queue = subscribeInternal(host, port, tableName, offset);

            lock (queueHandlers)
            {
                queueHandlers[tableName2Topic[host + ":" + port + ":" + tableName]] = new QueueHandlerBinder(this, queue, handler);
            }
        }
Пример #2
0
        public ThreadPooledClient(string subscribeHost, int subscribePort) : base(subscribeHost, subscribePort)
        {
            Dictionary <String, Queue <IMessage> > backlog = new Dictionary <string, Queue <IMessage> >();

            bool fillBacklog()
            {
                backlog.Clear();
                bool filled = false;

                lock (queueHandlers)
                {
                    foreach (KeyValuePair <string, QueueHandlerBinder> keyValue in queueHandlers)
                    {
                        if (keyValue.Value.Item1.TryTake(out List <IMessage> messages))
                        {
                            Queue <IMessage> queue = new Queue <IMessage>();
                            messages.ForEach(queue.Enqueue);
                            backlog[keyValue.Key] = queue;
                            filled = true;
                        }
                    }
                }
                return(filled);
            }

            void run()
            {
                try {
                    while (!this.isClose())
                    {
                        foreach (KeyValuePair <String, Queue <IMessage> > keyValue in backlog)
                        {
                            Queue <IMessage> value = keyValue.Value;
                            string           topic = keyValue.Key;
                            while (value.Count > 0)
                            {
                                IMessage           msg    = value.Dequeue();
                                QueueHandlerBinder binder = null;
                                lock (queueHandlers)
                                {
                                    if (queueHandlers.ContainsKey(topic))
                                    {
                                        binder = queueHandlers[topic];
                                        HandlerRunner handlerRunner = new HandlerRunner(binder.Item2, msg);
                                        ThreadPool.QueueUserWorkItem(new WaitCallback(handlerRunner.run));
                                    }
                                }
                            }
                        }
                        fillBacklog();
                    }
                }
                catch (ThreadInterruptedException)
                {
                }
                Console.WriteLine("ThreadPooledClient thread stopped.");
            }

            thread_ = new Thread(new ThreadStart(run));
            thread_.Start();
        }