internal Node(RelayNodeDefinition nodeDefinition, NodeGroup ownerGroup, NodeCluster ownerCluster, ForwardingConfig forwardingConfig, DispatcherQueue inMessageQueue, DispatcherQueue outMessageQueue) { DetectedZone = 0; NodeDefinition = nodeDefinition; NodeGroup = ownerGroup; NodeCluster = ownerCluster; _messageCounts = new int[RelayMessage.NumberOfTypes]; _lastMessageTimes = new double[RelayMessage.NumberOfTypes]; _averageMessageTimes = new double[RelayMessage.NumberOfTypes]; if (EndPoint != null) { _transport = TransportFactory.CreateTransportForNode(nodeDefinition, ownerGroup.GroupDefinition, forwardingConfig.MessageChunkLength); DetectedZone = NodeManager.Instance.GetZoneForAddress(EndPoint.Address); if (forwardingConfig.MapNetwork) { HopsFromHere = HowManyHopsFromHere(); } else { HopsFromHere = 0; } } else { _transport = new NullTransport(); } _inMessageQueue = inMessageQueue; _outMessageQueue = outMessageQueue; if (forwardingConfig != null) { _messageBurstLength = forwardingConfig.MessageBurstLength; _messageBurstTimeout = forwardingConfig.MessageBurstTimeout; _messageBurstTimeoutSpan = TimeSpan.FromMilliseconds(_messageBurstTimeout); MessageErrorQueue = new MessageQueue(ownerGroup.GetQueueConfig()); _repostMessageLists = forwardingConfig.RepostMessageLists; } ActivateBurstReceive(1); //the burst length will be used after the first message is received // async, no skipping of the error queue (duh) Arbiter.Activate(_inMessageQueue, Arbiter.Receive<List<SerializedRelayMessage>>(true, _inMessagesPort, messages => DoHandleInMessages(messages, false))); Arbiter.Activate(_outMessageQueue, Arbiter.Receive<MessagesWithLock>(true, _outMessagesPort, delegate(MessagesWithLock messages) { HandleOutMessages(messages.Messages); messages.Locker.Decrement(); })); }
internal void ReloadMapping(RelayNodeDefinition relayNodeDefinition, ForwardingConfig forwardingConfig) { NodeDefinition = relayNodeDefinition; Interlocked.Exchange(ref _messageBurstLength, forwardingConfig.MessageBurstLength); Interlocked.Exchange(ref _messageBurstTimeout, forwardingConfig.MessageBurstTimeout); _repostMessageLists = forwardingConfig.RepostMessageLists; if (EndPoint != null) { DetectedZone = NodeManager.Instance.GetZoneForAddress(EndPoint.Address); } else { DetectedZone = 0; } _messageBurstTimeoutSpan = TimeSpan.FromMilliseconds(_messageBurstTimeout); if (MessageErrorQueue == null) { MessageErrorQueue = new MessageQueue(NodeGroup.GetQueueConfig()); } else { MessageErrorQueue.ReloadConfig(NodeGroup.GetQueueConfig()); } SocketTransportAdapter socketTransport = _transport as SocketTransportAdapter; if (socketTransport != null) { socketTransport.LoadSettings(NodeDefinition, NodeGroup.GroupDefinition); } //changes in other forwarding settings are handled by the nodemanager using the Set & Start NewDispatcher methods. }