コード例 #1
0
        public static async Task RunParallelPassiveConsumerAsync(
            IConnection conn,
            MyWorkerContext ctx,
            int agentCount
            )
        {
            var agentList = new List <ConsumingAgent>();

            try
            {
                Console.WriteLine($"Sub ({agentCount}) start {ctx.Subject}");
                ctx.CronoStart();

                var listeners = new Task[agentCount];
                for (int i = 0; i < agentCount; i++)
                {
                    var agent = ConsumingAgent.CreatePassive(conn, ctx, null);
                    agentList.Add(agent);
                    listeners[i] = Task.Run(agent.PassiveWorkerAsync);
                }
                await Task.WhenAll(listeners);

                ctx.CronoStop();
                Console.WriteLine($"Sub ({agentCount}) end {ctx.Subject}");
            }
            finally
            {
                foreach (var agent in agentList)
                {
                    agent.Dispose();
                }
            }
        }
コード例 #2
0
ファイル: Workers.cs プロジェクト: highfield/Cet.NATS.Client
        public static void RunParallelReactiveConsumer(
            Original.IConnection conn,
            MyWorkerContext ctx,
            int agentCount
            )
        {
            var agentList = new List <ConsumingAgent>();

            try
            {
                Console.WriteLine($"Sub ({agentCount}) start {ctx.Subject}");
                ctx.CronoStart();

                var cde = new CountdownEvent(agentCount);
                for (int i = 0; i < agentCount; i++)
                {
                    var agent = ConsumingAgent.CreatePassive(conn, ctx, cde);
                    agentList.Add(agent);
                    ThreadPool.QueueUserWorkItem(agent.PassiveWorker);
                }
                cde.Wait();

                ctx.CronoStop();
                Console.WriteLine($"Sub ({agentCount}) end {ctx.Subject}");
            }
            finally
            {
                foreach (var agent in agentList)
                {
                    agent.Dispose();
                }
            }
        }
コード例 #3
0
        private async Task ProducingWorkerAsync(MyWorkerContext ctx)
        {
            ClientOptions     opts = ConnectionUtils.GetDefaultOptions();
            ConnectionFactory cf   = new ConnectionFactory();

            using (IConnection conn = await cf.CreateConnectionAsync(opts, CancellationToken.None))
            {
                Workers.RunPublisher(conn, ctx);
            }
        }
コード例 #4
0
        private async Task ConsumingWorkerAsync(MyWorkerContext ctx)
        {
            ClientOptions     opts = ConnectionUtils.GetDefaultOptions();
            ConnectionFactory cf   = new ConnectionFactory();

            using (IConnection conn = await cf.CreateConnectionAsync(opts, CancellationToken.None))
            {
                await Workers.RunParallelPassiveConsumerAsync(conn, ctx, ConsumingAgentCount);

                //Workers.RunParallelReactiveConsumer(conn, ctx, ConsumingAgentCount);
            }
        }
コード例 #5
0
        public static ConsumingAgent CreateReactive(
            Original.IConnection conn,
            MyWorkerContext ctx,
            CountdownEvent cde
            )
        {
            var instance = new ConsumingAgent();

            instance._subReactive = conn.SubscribeAsync(ctx.Subject + ".>", instance.ReactiveHandler);
            instance._ctx         = ctx;
            instance._cde         = cde;
            return(instance);
        }
コード例 #6
0
        public static ConsumingAgent CreatePassive(
            IConnection conn,
            MyWorkerContext ctx,
            CountdownEvent cde
            )
        {
            var instance = new ConsumingAgent();

            instance._subPassive = conn.SubscribePassive(ctx.Subject + ".>");
            instance._ctx        = ctx;
            instance._cde        = cde;
            return(instance);
        }
コード例 #7
0
        public static PublishingAgent Create(
            IConnection conn,
            MyWorkerContext ctx,
            CountdownEvent cde
            )
        {
            var instance = new PublishingAgent();

            instance._conn   = conn;
            instance._ctx    = ctx;
            instance._cde    = cde;
            instance._buffer = new byte[1000 + (int)(ctx.Description.Length * 1.1)];
            return(instance);
        }
コード例 #8
0
ファイル: Workers.cs プロジェクト: highfield/Cet.NATS.Client
        public static void RunPublisher(
            Original.IConnection conn,
            MyWorkerContext ctx
            )
        {
            Console.WriteLine("Pub start " + ctx.Subject);
            ctx.CronoStart();

            var agent = PublishingAgent.Create(conn, ctx, null);

            agent.Worker(null);

            ctx.CronoStop();
            Console.WriteLine($"Pub end {ctx.FormatStats(1)}");
        }
コード例 #9
0
        public void Run()
        {
            Task consTask;
            {
                var ctx = new MyWorkerContext(Subject, Description, LoopCount);
                consTask = Task.Run(() => this.ConsumingWorkerAsync(ctx));
            }

            Task prodTask;

            {
                var ctx = new MyWorkerContext(Subject, Description, LoopCount);
                prodTask = Task.Run(() => this.ProducingWorkerAsync(ctx));
            }

            prodTask.Wait();
            consTask.Wait();
        }
コード例 #10
0
        public void Run()
        {
            var consThread = new Thread(this.ConsumingWorker);
            {
                var ctx = new MyWorkerContext(Subject, Description, LoopCount);
                consThread.Start(ctx);
            }

            var prodThread = new Thread(this.ProducingWorker);

            {
                var ctx = new MyWorkerContext(Subject, Description, LoopCount);
                prodThread.Start(ctx);
            }

            prodThread.Join();
            consThread.Join();
        }
コード例 #11
0
 public WorkerController(MyWorkerContext context)
 {
     _context = context;
 }