예제 #1
0
파일: Model.cs 프로젝트: CodeFork/HarakaMQ
        public QueueDeclareOk QueueDeclare(string queue)
        {
            var msg = new AdministrationMessage(MessageType.QueueDeclare, queue);

            _comm.SendAdministrationMessage(msg);
            return(new QueueDeclareOk(queue, 0, 0));
        }
예제 #2
0
파일: Model.cs 프로젝트: CodeFork/HarakaMQ
        public void BasicConsume(string queue, IBasicConsumer consumer)
        {
            var msg = new AdministrationMessage(MessageType.Subscribe, queue);

            _comm.SendAdministrationMessage(msg);
            consumers.Add(new Tuple <IBasicConsumer, string>(consumer, queue));
        }
예제 #3
0
        public void SendAdministrationMessage(AdministrationMessage msg, string ip, int port)
        {
            var client  = GetClient(ip, port);
            var package = new Packet(Setup.Port)
            {
                SeqNo = GetOutGoingSeqNo(ip, port), Type = PacketType.AdminitrationMessages, AdministrationMessage = msg
            };

            _guranteedDelivery.Send(new ExtendedPacketInformation(package, UdpMessageType.Packet, client.Ip, client.Port));

            if (!Setup.NoDelayedAckClients.Contains(client.Id))
            {
                _schedular.TryScheduleDelayedAck(Setup.DelayedAckWaitTime, client.Id, SendDelayedAck);
            }
        }
예제 #4
0
        private void SendAntiEntropyMessage()
        {
            foreach (var broker in _brokers.Where(x => x.Active))
            {
                var numberOfBytesUsed       = 0;
                var tentativeMessagesToSend = _antiEntropy.GetTentativeMessagesToSendForNonPrimaryBroker(ref numberOfBytesUsed, _currentAntiEntropyRound);

                // + 1 because LastCommittedSeqNumberReceived represent the last received, and that number of message should not be resend
                var comittedMessagesToSend = _antiEntropy.GetCommittedMessagesToSend(ref numberOfBytesUsed, broker.LastCommittedSeqNumberReceived + 1);
                if (comittedMessagesToSend.Any())
                {
                    broker.LastCommittedSeqNumberReceived = comittedMessagesToSend.Last().Packet.GlobalSequenceNumber.Value;
                }

                broker.AntiEntropyRoundScheduledTaskIdAnswer = Guid.NewGuid();
                Console.WriteLine("Committed Messages " + comittedMessagesToSend.Count);
                Console.WriteLine("Tentative Messages " + tentativeMessagesToSend.Count);

                var administrationMessage = new AdministrationMessage(MessageType.AntiEntropy, MessagePackSerializer.Serialize(new AntiEntropyMessage
                {
                    PrimaryNumber             = _jsonConfigurator.GetSettings().PrimaryNumber,
                    Tentative                 = tentativeMessagesToSend,
                    Committed                 = comittedMessagesToSend,
                    Publishers                = _antiEntropy.GetPublishers(),
                    Subscribers               = _antiEntropy.GetSubscribers(),
                    AntiEntropyRound          = _currentAntiEntropyRound,
                    Primary                   = _isPrimary ? _jsonConfigurator.GetSettings().PrimaryNumber : 0,
                    AntiEntropyGarbageCollect = _currentAntiEntropyRound % 3 == 0 // GC every third round
                }));
                _udpCommunication.SendAdministrationMessage(administrationMessage, broker.Ipadress, broker.Port);
                Console.WriteLine("Time: " + _clock.ElapsedTimeSpan());
                //TODO: activate this later on
                //_schedular.ScheduleTask(Setup.Settings.AntiEntropyMilliseonds, broker.AntiEntropyRoundScheduledTaskIdAnswer, () =>
                //{
                //    broker.DeactivateBroker();
                //    //Todo: Broadcast to subs/pubs/brokers that a broker is down
                //});
            }
        }
예제 #5
0
 public void SendAdministrationMessage(AdministrationMessage msg, string ip, int port)
 {
     _automaticRepeatReqeust.SendAdministrationMessage(msg, ip, port);
 }
예제 #6
0
 public void SendAdministrationMessage(AdministrationMessage msg)
 {
     _automaticRepeatReqeust.SendAdministrationMessage(msg, _ip, _port);
 }