Exemplo n.º 1
0
		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(); }));
		}
Exemplo n.º 2
0
		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.		
		}