Пример #1
0
 public Service(Services services, int id, IEnumerable<JToken> address, int port)
 {
     _services = services;
     _id = id;
     var addressList = new List<byte[]>();
     foreach (var bytes in address)
         addressList.Add((byte[]) bytes);
     _address = addressList.ToArray();
     _port = port;
 }
Пример #2
0
        public void JoinService(IChannel channel, string name, int id, JArray address, int port)
        {
            var services = GetServices(name);
            if(services == null)
            {
                _servicesLock.EnterWriteLock();
                if (!_services.ContainsKey(name))
                {
                    services = new Services(name);
                    _services.Add(name, services);
                }
                else
                {
                    services = _services[name];
                }
                _servicesLock.ExitWriteLock();
            }

            _addremoveQueue.Enqueue(new AddRemoveItem() { IsAdd = true, Channel = channel, Address = address, Port=port,  Id = id, Services = services });
        }
Пример #3
0
        private void AddService(IChannel channel, Services services, int id, JArray address, int port)
        {
            var service = services.JoinService(channel, id, address, port);

            if (id == -1)
            {
                dynamic packet = new JObject();
                packet.type = "max_entity_id";
                packet.value = 10000;
                channel.SendMessage(packet);

                var networks = _networkManager.GetNetworks(service);

                int notifyServiceCount = 0;
                foreach (var network in networks)
                {
                    var remoteServiceName = network.Service1 == services.GetServicesName() ? network.Service2 : network.Service1;
                    var remoteService = GetServices(remoteServiceName);
                    if (remoteService == null)
                        continue;
                    notifyServiceCount += remoteService.NotifyJoinService(service, network);
                }
                //Interlocked.Increment
                //여기서 광역 락 시전!
                //추가 됬다고 정보를 알린 모든 서비스에서 승인이 떨어지면 다음꺼 처리.
                if (notifyServiceCount > 0)
                {
                    _addremoveService = service;
                    _notifyServiceCount = notifyServiceCount;
                    _nextAddRemoveProcessing = new AutoResetEvent(false);
                    _nextAddRemoveProcessing.WaitOne();
                }
            }
        }