static void WorkerDo(string type) { while (true) { try { while (_stopWorker.ContainsKey(type) == false || _stopWorker[type] == false) { try { if (!CommandsAndEventsRegisterEngine.EventWorkerCanDequeue(type)) { continue; } if (RedisServices.IsEnable) { var queueName = BuildRedisQueueName(type); var typeRegistered = CommandsAndEventsRegisterEngine.FindTypeOfCommandOrEvent(type); var evtJson = RedisServices.RedisDatabase .ListRightPop(queueName); if (evtJson.HasValue) { var evt = JsonConvert.DeserializeObject(evtJson, typeRegistered) as IEvent; if (evt != null) { try { CommandsAndEventsRegisterEngine.ExecEvent(evt); } catch (Exception ex) { Console.WriteLine(ex.Message); RedisServices.RedisDatabase .ListLeftPush(queueName, evtJson); } } else { RedisServices.RedisDatabase .ListLeftPush(queueName, evtJson); } } } else { if (_cmdDataQueue.TryGetValue(type, out ConcurrentQueue <IEvent> cmdQueue) && cmdQueue != null) { //in-memory queue, can be use redis queue, rabitmq ... if (cmdQueue.TryDequeue(out IEvent evt) && evt != null) { CommandsAndEventsRegisterEngine.ExecEvent(evt); } } } } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { Thread.Sleep(0); } } if (!_workerCounterStoped.ContainsKey(type)) { _workerCounterStoped[type] = 0; } if (_workerStoped[type] == false) { var counter = _workerCounterStoped[type]; counter++; _workerCounterStoped[type] = counter; lock (_locker) { if (_cmdWorker.TryGetValue(type, out List <Thread> listThread)) { if (listThread.Count == counter) { _workerStoped[type] = true; _workerCounterStoped[type] = 0; } } } } } finally { Thread.Sleep(100); } } }
static void WorkerDo(string type) { while (true) { try { while (_stopWorker.ContainsKey(type) == false || _stopWorker[type] == false) { try { if (!CommandsAndEventsRegisterEngine.EventWorkerCanDequeue(type)) { Thread.Sleep(100); continue; } if (RedisServices.IsEnable) { var channel = BuildRedisChannelName(type); var allSubscribe = RedisServices.RedisDatabase.HashGetAll(channel); if (allSubscribe.Count() <= 0) { Console.WriteLine("No consummer to process event data"); Thread.Sleep(100); continue; } var queueName = BuildRedisQueueName(type); var typeRegistered = CommandsAndEventsRegisterEngine.FindTypeOfCommandOrEvent(type); var evtJson = RedisServices.RedisDatabase.ListRightPop(queueName); if (evtJson.HasValue) { try { var evt = JsonConvert.DeserializeObject(evtJson, typeRegistered) as IEvent; if (evt != null) { foreach (var subscriber in allSubscribe) { var topic = BuildRedisTopicName(channel, subscriber.Name); RedisServices.RedisSubscriber.Publish(topic, evtJson); } } else { RedisServices.RedisDatabase.ListLeftPush(queueName, evtJson); } } catch (Exception ex) { RedisServices.RedisDatabase.ListLeftPush(queueName, evtJson); Console.WriteLine(ex.Message); } } } else { if (_evtDataQueue.TryGetValue(type, out ConcurrentQueue <IEvent> evtQueue) && evtQueue != null) { //in-memory queue, can be use redis queue, rabitmq ... if (evtQueue.TryDequeue(out IEvent evt) && evt != null) { CommandsAndEventsRegisterEngine.ExecEvent(evt); } } } } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { Thread.Sleep(100); } } if (!_workerCounterStoped.ContainsKey(type)) { _workerCounterStoped[type] = 0; } if (_workerStoped[type] == false) { var counter = _workerCounterStoped[type]; counter++; _workerCounterStoped[type] = counter; lock (_locker) { if (_evtWorker.TryGetValue(type, out List <Thread> listThread)) { if (listThread.Count == counter) { _workerStoped[type] = true; _workerCounterStoped[type] = 0; } } } } } finally { Thread.Sleep(100); } } }