Ejemplo n.º 1
0
        public void Run(CancellationToken token)
        {
            using (Socket processPullSocket = _context.CreateSocket(SocketType.PULL))
                using (Socket routerPushSocket = _context.CreateSocket(SocketType.PUSH))
                {
                    // Bind and connect to sockets
                    processPullSocket.Bind(_processPullAddress);
                    routerPushSocket.Connect(_routerPushAddress, token);

                    // Process while canellation not requested
                    while (!token.IsCancellationRequested)
                    {
                        // Waits for binary envelopes (with timeout)
                        var packet = processPullSocket.RecvPacket(200);
                        if (packet == null)
                        {
                            continue;
                        }

                        // Ignore packets without messages
                        if (packet.Headers.ContentType != ContentType.Messages)
                        {
                            continue;
                        }

                        foreach (var envelope in packet.Envelopes)
                        {
                            //Console.WriteLine("Envelope accepted : {0}. Now = {1}. Current: {2}, Previous: {3}", envelope.GetMessage().ToString(), DateTime.Now.Millisecond, packet.GetHeaders().CurrentJournalSequence, packet.GetHeaders().PreviousJournalSequence);
                        }

                        // Publish all messages
                        //PublishMessages(routerPushSocket, packet, 1);
                    }
                }
        }
Ejemplo n.º 2
0
        public void Run(CancellationToken token)
        {
            Int64 previousJournalSeq = 0;
            Int64 currentJournalSeq  = 0;


            using (Socket routerRepSocket = _context.CreateSocket(SocketType.PULL))
                using (Socket routerPubSocket = _context.CreateSocket(SocketType.PUB))
                    using (Socket domainReqSocket = _context.CreateSocket(SocketType.PUSH))
                    {
                        // Bind and connect to sockets
                        routerRepSocket.Bind(_routerRepAddress);
                        routerPubSocket.Bind(_routerPubAddress);
                        domainReqSocket.Connect(_domainReqAddress, token);

                        // Process while canellation not requested
                        while (!token.IsCancellationRequested)
                        {
                            // Waits for binary envelopes (with timeout)
                            var packet = routerRepSocket.RecvPacket(200);
                            if (packet == null)
                            {
                                continue;
                            }

                            // Ignore packets without messages
                            if (packet.Headers.ContentType != ContentType.Messages)
                            {
                                continue;
                            }

                            previousJournalSeq = currentJournalSeq;

                            // Journal all messages
                            currentJournalSeq = JournalPacket(packet);

                            // Publish all messages
                            PublishMessages(routerPubSocket, packet, currentJournalSeq);

                            // Router to process node
                            Route(domainReqSocket, "process", packet.CloneEnvelopes(), currentJournalSeq, previousJournalSeq);
                        }
                    }
        }
Ejemplo n.º 3
0
        private void PublishMessages(Socket routerPubSocket, IPacket packet, Int64 seq)
        {
            var clonedEnvelopes = packet.CloneEnvelopes();

            for (int i = 0; i < clonedEnvelopes.Count; i++)
            {
                var envelope = clonedEnvelopes[i];

                var metadata = envelope.Metadata;
                // Set sequence for each message
                metadata.JournalSequence = seq - clonedEnvelopes.Count + i + 1;

                var newPacket = _context.CreatePacket(b => b
                                                      .AddMessage(envelope.MessageBinary, metadata)
                                                      );

                routerPubSocket.SendPacket(newPacket);
            }
        }
Ejemplo n.º 4
0
        private void Route(Socket socket, String routerName, IList <IPacketMessageEnvelope> envelopes, Int64 currentJournalSequence, Int64 previousJournalSequence)
        {
            var router = _context.RouterFactory.GetRouter(routerName);
            var outbox = router.Route(envelopes);

            if (outbox.Count == 0)
            {
                return;
            }

            var headers = new PacketHeaders()
            {
                CurrentJournalSequence  = currentJournalSequence,
                PreviousJournalSequence = previousJournalSequence
            };

            var packet = _context.CreatePacket(outbox, headers);

            socket.SendPacket(packet);
        }