Beispiel #1
0
        //depunere
        public bool EfectueazaTranzactie(double sum, ContDTO source)
        {
            //compune o comanda si serializeaz-o
            String serializedCommand = new SerializedCommandDTO(sum, source).Serialize();

            //trimite comanda pe coada de comenzi. Procesatorul de comenzi va pune un rezultatt pe coada de rezultate
            CmdSender.Send(serializedCommand);
            //cere rezultatul
            SerializedResultDTO res = ResultReceiver.Receive(); //astepta raspunsul de pe coada de raspunsuri

            //modifica fisierele conform rezultatului comenzii
            _writeRepo.AdaugaTranzactie(res.tranzactii[0], res.conturi[0].iban);
            _writeRepo.ActualizareContInLista(source, res.conturi[0].Sold);
            return(true);
        }
        public static void Receive()
        {
            String serializedResult = "";
            var    factory          = new ConnectionFactory()
            {
                HostName = "localhost"
            };

            using (var connection = factory.CreateConnection())
                using (var channel = connection.CreateModel()) //deschide un canal de comunicare
                {
                    //creare coada, daca nu exist a deja
                    channel.QueueDeclare(queue: "command", //numele cozii, acelasi cu coada care pe care se transmite in sender
                                         durable: false,
                                         exclusive: false,
                                         autoDelete: false,
                                         arguments: null);

                    //creare obiect consumer care va primi mesajul de pe canalul de comunicare
                    var    consumer = new EventingBasicConsumer(channel);
                    String message  = ""; //declare string in care se va prelua mesajul
                                          // dupa ca va fi decodat

                    //ce sa se intample cand s-a primit mesajul
                    consumer.Received += (model, ea) =>
                    {
                        var body = ea.Body;
                        message = Encoding.UTF8.GetString(body);
                        SerializedCommandDTO cmd = JsonConvert.DeserializeObject <SerializedCommandDTO>(message);
                        if (cmd.TipTranzactie.Equals("transfera"))
                        {
                            //preia datele din comanda (deserializate)
                            double  sum         = cmd.suma;
                            ContDTO source      = cmd.conturi[0];
                            ContDTO destination = cmd.conturi[1];

                            //proceseaza comanda si obtine prin asta un raspuns serializat (rezultatul)
                            String res = ProcesatorComanda.Proceseaza(sum, source, destination);

                            serializedResult = res;
                        }
                        else if (cmd.TipTranzactie.Equals("depunere"))
                        {
                            double  sum    = cmd.suma;
                            ContDTO source = cmd.conturi[0];

                            String res = ProcesatorComanda.Proceseaza(sum, source);

                            serializedResult = res;
                        }
                    };

                    //Asteapta sa se primeasca mesajul
                    channel.BasicConsume(queue: "command",
                                         autoAck: true,
                                         consumer: consumer);

                    do
                    {
                        //asteapta sa se proceseze comanda apoi trimite raspunsul
                        if (!serializedResult.Equals(""))
                        {
                            //trimite rezultatul pe coada de raspuns
                            ResultSender.Send(serializedResult);
                        }
                    } while (serializedResult.Equals(""));
                }
        }