private static void SharedWorker()
        {
            var workMethod = new Func <CommonRequest, bool>(r =>
            {
                var message = r.Message;
                Console.WriteLine("[{2}] Received from {0}, message {1}", r.ClientId.ToPrintable(), r.RequestId, DateTime.Now.ToLongTimeString());

                Console.WriteLine("[x] Working {0}ms", r.Duration);
                Thread.Sleep(r.Duration);

                Console.WriteLine("[x] Done");

                var qName = string.Format("{0}_queue", r.ClientId.ToString());

                var publisher = new Common.SharedWorker.Producer <CommonReply>("localhost", qName);
                publisher.Publish(new CommonReply {
                    ClientId = r.ClientId, ReplyId = r.RequestId, Success = true
                });

                return(true);
            });

            Console.WriteLine("[*] Waiting for messages. To exit press CTRL+C");

            //var consumer = new Common.PubSub.Consumer();
            var consumer = new Common.SharedWorker.Consumer <CommonRequest>();

            consumer.Start(workMethod);
        }
Example #2
0
        private static void SharedWorker()
        {
            int  msgCount = 10;
            Guid clientId = Guid.NewGuid();

            var messagesToSend   = new List <CommonRequest>();
            var receivedMessages = new List <int>();

            for (int i = 0; i < msgCount; i++)
            {
                messagesToSend.Add(new CommonRequest
                {
                    ClientId  = clientId,
                    RequestId = i,
                    Message   = "Hello: " + i,
                    Duration  = 5000
                });
            }

            Console.WriteLine("Client {0}", clientId.ToPrintable());

            var senderTask = Task.Factory.StartNew(() =>
            {
                // Broadcast to all
                //var producer = new Common.PubSub.Producer();

                // Send only to one at a time
                var producer = new Common.SharedWorker.Producer <CommonRequest>();

                foreach (var msg in messagesToSend)
                {
                    producer.Publish(msg);
                    Console.WriteLine("[x] Sent {0}", msg.RequestId);
                    Thread.Sleep(2000);
                }

                Console.WriteLine("Sent all");
            });

            var receiverTask = Task.Factory.StartNew(() =>
            {
                var qName    = string.Format("{0}_queue", clientId.ToString());
                var consumer = new Common.SharedWorker.Consumer <CommonReply>("localhost", qName);

                var func = new Func <CommonReply, bool>(r =>
                {
                    Console.WriteLine("[{1}] Received {0}", r.ReplyId, DateTime.Now.ToLongTimeString());

                    receivedMessages.Add(r.ReplyId);

                    if (receivedMessages.Count == messagesToSend.Count)
                    {
                        consumer.Stop();
                    }

                    return(true);
                });

                consumer.Start(func);
            });

            while (receivedMessages.Count != messagesToSend.Count)
            {
                Thread.Sleep(500);
            }

            //Task.WaitAll(senderTask, receiverTask);

            Console.WriteLine("Press any key to quit");
            Console.ReadLine();
        }