示例#1
0
        public IJobQueue Register()
        {
            IConsumerContext ctx        = Turbine.Consumer.AppUtility.GetConsumerContext();
            Guid             consumerId = ctx.Id;
            String           hostname   = ctx.Hostname;

            Debug.WriteLine(String.Format("Register as {0}, {1}", consumerId, hostname), this.GetType().Name);

            //
            // NOTE: Amazon InstanceID and AMI removed
            //
            using (TurbineModelContainer container = new TurbineModelContainer())
            {
                container.JobConsumers.AddObject(new JobConsumer()
                {
                    Id        = consumerId,
                    hostname  = hostname,
                    AMI       = "",
                    instance  = "",
                    processId = Process.GetCurrentProcess().Id.ToString(),
                    status    = "up",
                    keepalive = DateTime.UtcNow
                }
                                                 );
                container.SaveChanges();
            }
            queue = new DBJobQueue();
            return(queue);
        }
        public IJobQueue Register(IConsumerRun run)
        {
            this.run = run;
            IConsumerContext ctx = Turbine.Consumer.AppUtility.GetConsumerContext();
            //Guid consumerId = ctx.Id;
            //Guid consumerId = Guid.NewGuid();
            String hostname = ctx.Hostname;
            String appName  = run.SupportedApplications.ElementAtOrDefault(0);

            Debug.WriteLine(String.Format("Register({0}) as {1}, {2}", appName, run.ConsumerId, hostname), this.GetType().Name);
            using (ProducerContext db = new ProducerContext())
            {
                // TODO: Registering as a single application is dubious.
                // IF support multiple apps in single consumer need to expose that via the database ( update SCHEMA!! )
                var app      = db.Applications.Single(a => a.Name == appName);
                var consumer = new Turbine.Data.Entities.JobConsumer
                {
                    Application = app,
                    Id          = run.ConsumerId,
                    hostname    = hostname,
                    processId   = System.Diagnostics.Process.GetCurrentProcess().Id,
                    keepalive   = DateTime.UtcNow,
                    status      = "up"
                };
                db.Consumers.Add(consumer);
                db.SaveChanges();
            }
            queue = AppUtility.GetJobQueue(run);
            //((DBJobQueue)queue).consumerId = consumerId;
            return(queue);
        }
 public BatchConsumeMessageContext(
     IConsumerContext consumer,
     IReadOnlyCollection <IMessageContext> batchMessage)
 {
     this.ConsumerContext = consumer;
     this.Message         = new Message(null, batchMessage);
 }
 public async ValueTask Execute(IConsumerContext context)
 {
     using var scope = Provider.CreateScope();
     var pipeline = scope.ServiceProvider.GetRequiredService(context.ConsumerDefinition.PipelineType) as IConsumerPipeline
                    ?? throw new ArgumentException($"{context.ConsumerDefinition.PipelineType} does not implement {typeof(IConsumerPipeline).FullName}");
     await pipeline.Execute(context);
 }
        public async ValueTask Execute(IConsumerContext context)
        {
            var message = Serializer.Deserialize <TMessage>(context.Message);

            if (message is not null)
            {
                await Consumer.Consume(context, message);
            }
        }
        public async ValueTask Execute(IConsumerContext context)
        {
            using var transaction = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled);
            var transactionContext = new TransactionContext(context);
            await Pipeline.Execute(transactionContext);

            await transactionContext.PublishMessages();

            transaction.Complete();
        }
示例#7
0
 public MessageContext(
     Message message,
     IMessageHeaders headers,
     IConsumerContext consumer,
     IProducerContext producer)
 {
     this.Message         = message;
     this.Headers         = headers ?? new MessageHeaders();
     this.ConsumerContext = consumer;
     this.ProducerContext = producer;
 }
示例#8
0
 public async ValueTask Execute(IConsumerContext context)
 {
     try
     {
         await _pipeline.Execute(context);
     }
     catch (Exception e)
     {
         _logger.LogError(e, context.Message.ToString());
     }
 }
示例#9
0
        private void AuthorizeConsumer(Job obj)
        {
            IConsumerContext ctx          = AppUtility.GetConsumerContext();
            Guid             consumerGUID = ctx.Id;
            Guid             jobGUID      = obj.Consumer.Id;

            if (jobGUID != Guid.Empty && jobGUID != consumerGUID)
            {
                throw new IllegalAccessException(String.Format(
                                                     "job({0}) consumer access denied {1} != {2}", obj.Id, jobGUID, consumerGUID)
                                                 );
            }
        }
示例#10
0
        public void Error()
        {
            IConsumerContext ctx        = AppUtility.GetConsumerContext();
            Guid             consumerId = ctx.Id;

            Debug.WriteLine(String.Format("Error as {0}, {1}", consumerId), this.GetType().Name);

            using (TurbineModelContainer container = new TurbineModelContainer())
            {
                var consumer = (JobConsumer)container.JobConsumers.Single <Turbine.Data.JobConsumer>(s => s.Id == consumerId);
                consumer.status = "error";
                container.SaveChanges();
            }
        }
        public void TestMethod1()
        {
            consumerCtx = Turbine.Consumer.AppUtility.GetConsumerContext();
            //appCtx = Turbine.Consumer.AppUtility.GetAppContext();


            //Assert.AreNotSame(consumerCtx, Turbine.Consumer.AppUtility.GetConsumerContext());
            IUnityContainer container = Turbine.Consumer.AppUtility.container;

            //container.RegisterInstance<IContext>(consumerCtx);
            container.RegisterInstance <IConsumerContext>(consumerCtx);

            Assert.AreSame(consumerCtx, Turbine.Consumer.AppUtility.GetConsumerContext());
        }
示例#12
0
        public static IEnumerable <TMessage> GetMessages <TMessage>(this IBus bus)
        {
            using (IConsumerContext <TMessage> context = bus.CreateConsumerContext <TMessage>())
            {
                foreach (var messageContext in Enumerator.Enumerate(context.GetMessage))
                {
                    if (messageContext.AcceptanceRequired)
                    {
                        messageContext.AcceptMessage();
                    }

                    yield return(messageContext.Message);
                }
            }
        }
 public async ValueTask Execute(IConsumerContext context)
 {
     var retryContext = new ConsumerRetryContext(context);
     await _retryPolicy.ExecuteAsync(async() =>
     {
         try
         {
             await _pipeline.Execute(retryContext);
         }
         catch (Exception)
         {
             retryContext.Increment();
             throw;
         }
     });
 }
示例#14
0
        public AzureConsumerContext(IConsumerContext consumerContext, ProcessMessageEventArgs azureContext, IServiceBus bus, ServiceBusSender sender)
        {
            _consumerContext = consumerContext;
            _azureContext    = azureContext;
            _bus             = bus;
            _sender          = sender;

            if (_azureContext.Message.ApplicationProperties.TryGetValue(nameof(Redeliveries), out var raw))
            {
                if (raw is object && int.TryParse(raw.ToString(), out var i))
                {
                    Redeliveries += i + 1;
                }
            }
            Redeliveries += _consumerContext.Redeliveries;
        }
        public void Error()
        {
            IConsumerContext ctx        = AppUtility.GetConsumerContext();
            Guid             consumerId = ctx.Id;

            Debug.WriteLine(String.Format("Error as {0}, {1}", consumerId), this.GetType().Name);

            /*
             * using (TurbineModelContainer container = new TurbineModelContainer())
             * {
             *  JobConsumer consumer = (JobConsumer)container.Consumers.First<Turbine.Data.Consumer>(s => s.guid == consumerId);
             *  consumer.status = "error";
             *  container.SaveChanges();
             * }
             * */
        }
示例#16
0
        public void KeepAlive()
        {
            IConsumerContext ctx        = AppUtility.GetConsumerContext();
            Guid             consumerId = ctx.Id;

            Debug.WriteLine(String.Format("KeepAlive Consumer {0}", consumerId), this.GetType().Name);

            using (TurbineModelContainer container = new TurbineModelContainer())
            {
                var consumer = (JobConsumer)container.JobConsumers.Single <Turbine.Data.JobConsumer>(s => s.Id == consumerId);
                if (consumer.status == "up")
                {
                    consumer.keepalive = DateTime.UtcNow;
                }
                container.SaveChanges();
            }
        }
示例#17
0
        /* UnRegister
         *     If state is "up" move to "down", else leave alone.
         */
        public void UnRegister()
        {
            IConsumerContext ctx        = AppUtility.GetConsumerContext();
            Guid             consumerId = ctx.Id;

            Debug.WriteLine(String.Format("UnRegister Consumer {0}", consumerId), this.GetType().Name);

            using (TurbineModelContainer container = new TurbineModelContainer())
            {
                var consumer = (JobConsumer)container.JobConsumers.First <Turbine.Data.JobConsumer>(s => s.Id == consumerId);
                if (consumer.status == "up")
                {
                    consumer.status = "down";
                }
                container.SaveChanges();
            }
        }
 public async ValueTask Execute(IConsumerContext context)
 {
     try
     {
         await Pipeline.Execute(context);
     }
     catch (Exception)
     {
         if (context.Redeliveries >= MaxRedeliveries)
         {
             throw;
         }
         var delay          = DelayProvider(context.Redeliveries);
         var redeliveryDate = DateTimeOffset.Now.Add(delay);
         await context.Reschedule(redeliveryDate);
     }
 }
示例#19
0
        /*  Setup: Moves job from submit to setup, concurrency issues to be aware of.
         *     Consumer must be registered before calling this method.
         *
         *      throws OptimisticConcurrencyException if job has already been
         *      grabbed by another consumer.
         *
         */
        public IProcess Setup()
        {
            string           baseDir    = AppUtility.GetAppContext().BaseWorkingDirectory;
            IConsumerContext ctx        = AppUtility.GetConsumerContext();
            Guid             consumerId = ctx.Id;
            Guid             pid        = Guid.Empty;

            using (TurbineModelContainer container = new TurbineModelContainer())
            {
                var consumer = container.JobConsumers
                               .SingleOrDefault <Turbine.Data.JobConsumer>(c => c.Id == consumerId);

                Debug.WriteLine(String.Format("Setup consumer GUID {0}", consumerId), this.GetType().Name);

                if (consumer == null)
                {
                    throw new IllegalAccessException("Setup failed, Consumer is not registered");
                }
                if (consumer.status != "up")
                {
                    throw new IllegalAccessException(String.Format(
                                                         "Setup failed, Consumer status {0} != up", consumer.status));
                }

                Job obj = container.Jobs.Single <Job>(s => s.Id == id);
                if (obj.State != "locked")
                {
                    throw new InvalidStateChangeException("Violation of state machine");
                }

                if (obj.Process == null)
                {
                    throw new InvalidStateChangeException("Process configuration missing");
                }

                obj.State = "setup";
                obj.Setup = DateTime.UtcNow;
                obj.Process.WorkingDir = Path.Combine(baseDir, id.ToString());
                obj.Consumer           = (JobConsumer)consumer;
                pid            = obj.Process.Id;
                simulationName = obj.Simulation.Name;
                container.SaveChanges();
            }
            return(SinterProcessContract.Get(pid));
        }
示例#20
0
        public IJobQueue Register()
        {
            IConsumerContext ctx        = Turbine.Consumer.AppUtility.GetConsumerContext();
            Guid             consumerId = ctx.Id;
            String           hostname   = ctx.Hostname;

            Debug.WriteLine(String.Format("Register as {0}, {1}", consumerId, hostname), this.GetType().Name);

            Turbine.Consumer.AWS.IAWSContext awsCtx = null;
            string ami      = "";
            string instance = "";

            try
            {
                awsCtx   = Turbine.Consumer.AWS.AppUtility.GetContext();
                ami      = awsCtx.AmiId;
                instance = awsCtx.InstanceId;
            }
            catch (Exception ex)
            {
                Debug.WriteLine(String.Format("Ignore AWS Context is not available: {0}", ex.Message), this.GetType().Name);
                Debug.WriteLine(String.Format("{0}", ex.StackTrace), this.GetType().Name);
            }

            //
            // NOTE: Amazon InstanceID and AMI removed
            //
            using (TurbineModelContainer container = new TurbineModelContainer())
            {
                container.JobConsumers.AddObject(new JobConsumer()
                {
                    Id        = consumerId,
                    hostname  = hostname,
                    AMI       = ami,
                    instance  = instance,
                    processId = Process.GetCurrentProcess().Id.ToString(),
                    status    = "up"
                }
                                                 );
                container.SaveChanges();
            }
            queue = new Turbine.Consumer.Data.Contract.DBJobQueue();
            return(queue);
        }
        public void Register()
        {
            IConsumerContext ctx        = AppUtility.GetConsumerContext();
            Guid             consumerId = ctx.Id;
            String           hostname   = ctx.Hostname;

            Debug.WriteLine(String.Format("Register as {0}, {1}", consumerId, hostname), this.GetType().Name);

            using (NHibernate.ISession session = SessionFactory.OpenSession())
            {
                using (NHibernate.ITransaction trans = session.BeginTransaction())
                {
                    var consumer = new JobConsumer()
                    {
                        Id = consumerId, hostname = hostname, status = "up"
                    };
                }
            }
        }
示例#22
0
        public void Register()
        {
            IConsumerContext ctx        = AppUtility.GetConsumerContext();
            Guid             consumerId = ctx.Id;
            String           hostname   = ctx.Hostname;

            Debug.WriteLine(String.Format("Register as {0}, {1}", consumerId, hostname), this.GetType().Name);

            using (TurbineModelContainer container = new TurbineModelContainer())
            {
                container.Consumers.AddObject(new JobConsumer()
                {
                    guid     = consumerId,
                    hostname = hostname,
                    status   = "up"
                }
                                              );
                container.SaveChanges();
            }
        }
示例#23
0
        static void Main(string[] args)
        {
            var              options     = new Options();
            string           dir         = Properties.Settings.Default.BaseDirectory;
            IUnityContainer  container   = Turbine.Consumer.AppUtility.container;
            IConsumerContext consumerCtx = Turbine.Consumer.AppUtility.GetConsumerContext();

            container.RegisterInstance <IConsumerContext>(consumerCtx);

            if (CommandLine.Parser.Default.ParseArguments(args, options))
            {
                // TODO: HACK TO BIND SIMULATION NAME
                consumerCtx.BindSimulationName = options.Simulation;
            }

            int iterations         = Properties.Settings.Default.TimeOutIterations;
            int setupIterations    = Properties.Settings.Default.TimeOutSetupIterations;
            int postInitIterations = Properties.Settings.Default.TimePostInitIterations;

            Turbine.Consumer.Console.SinterConsumerConsole.setTimeOutParams(iterations,
                                                                            setupIterations, postInitIterations);
            Turbine.Consumer.Console.SinterConsumerConsole.Run();
        }
示例#24
0
        /*  Setup: Moves job from submit to setup, concurrency issues to be aware of.
         *     Consumer must be registered before calling this method.
         *
         *      throws OptimisticConcurrencyException if job has already been
         *      grabbed by another consumer.
         *
         */
        public IProcess Setup()
        {
            string           baseDir    = AppUtility.GetAppContext().BaseWorkingDirectory;
            IConsumerContext ctx        = AppUtility.GetConsumerContext();
            Guid             consumerId = ctx.Id;

            using (TurbineModelContainer container = new TurbineModelContainer())
            {
                Consumer consumer = container.Consumers
                                    .SingleOrDefault <Consumer>(c => c.guid == consumerId);

                if (consumer == null)
                {
                    throw new IllegalAccessException("Setup failed, Consumer is not registered");
                }

                Job obj = container.Jobs.Single <Job>(s => s.Id == id);
                if (obj.State != "submit")
                {
                    throw new InvalidStateChangeException("Violation of state machine");
                }

                if (obj.Process == null)
                {
                    throw new InvalidStateChangeException("Process configuration missing");
                }

                obj.State = "setup";
                obj.Setup = DateTime.UtcNow;
                obj.Process.WorkingDir = Path.Combine(baseDir, id.ToString());
                obj.JobConsumer        = (JobConsumer)consumer;

                container.SaveChanges();
            }
            return(SinterProcessContract.Get(id));
        }
示例#25
0
        // Consumer grabs job in submit state off queue
        public IJobConsumerContract GetNext()
        {
            IJobConsumerContract contract = new AspenJobConsumerContract();;
            IConsumerContext     ctx      = AppUtility.GetConsumerContext();
            Guid consumerId = ctx.Id;

            using (TurbineModelContainer container = new TurbineModelContainer())
            {
                var consumer = container.JobConsumers
                               .SingleOrDefault <Turbine.Data.JobConsumer>(c => c.Id == consumerId);

                if (consumer == null)
                {
                    throw new IllegalAccessException("GetNext failed, Consumer is not registered");
                }
                if (consumer.status != "up")
                {
                    throw new IllegalAccessException(String.Format(
                                                         "GetNext failed, Consumer status {0} != up", consumer.status));
                }

                //Job obj = container.Jobs.OrderBy("it.Submit").
                //    FirstOrDefault<Job>(s => s.State == "submit");
                //obj.Simulation.ApplicationName

                Job obj = null;
                // TODO: CHange the WHERE clause to do an OR between all available applications
                if (applications == null)
                {
                    System.Data.Objects.ObjectQuery <Turbine.Data.Job> query = container.Jobs;
                    obj = query.OrderBy("it.Submit").FirstOrDefault <Job>(s => s.State == "submit");
                }
                else
                {
                    foreach (string appName in applications)
                    {
                        System.Data.Objects.ObjectQuery <Turbine.Data.Job> query = container.Jobs;
                        query = query.Where("it.Simulation.ApplicationName = @appName",
                                            new System.Data.Objects.ObjectParameter("appName", appName));
                        obj = query.OrderBy("it.Submit").FirstOrDefault <Job>(s => s.State == "submit");
                        if (obj != null)
                        {
                            break;
                        }
                    }
                }

                if (obj == null)
                {
                    return(null);
                }

                // Need to Check that Consumer is up
                obj.State = "locked";
                try
                {
                    container.SaveChanges();
                }
                catch (System.Data.OptimisticConcurrencyException)
                {
                    Debug.WriteLine("OptimisticConcurrencyException:  Failed attempt to lock job", GetType().Name);
                    return(null);
                }
                contract.Id = obj.Id;
            }
            return(contract);
        }
 public async ValueTask Execute(IConsumerContext context)
 {
     using (await _limiter.WaitAsync())
         await _pipeline.Execute(context);
 }
 public JsonPlaceHolderConsumer(IConsumerContext <JsonPlaceHolderConsumer> context)
     : base(context)
 {
 }
示例#28
0
 protected RxConsumer(IConsumerContext <RxConsumer> context)
 {
     this.context = context;
     http         = new RxHttpClient(context.Http, context.Logger);
 }
示例#29
0
        public static IConsumerContext GetConsumerContext()
        {
            IConsumerContext ctx = container.Resolve <IConsumerContext>();

            return(ctx);
        }
        public IJobConsumerContract GetNext(IConsumerRun run)
        {
            apps = run.SupportedApplications;
            IJobConsumerContract contract = null;

            if (apps.Length == 0)
            {
                throw new JobQueueException("Invalid JobQueue configuration:  no applications specified");
            }

            IConsumerContext appContext     = AppUtility.GetConsumerContext();
            string           simulationName = appContext.BindSimulationName;

            using (ProducerContext db = new ProducerContext())
            {
                Job job = null;
                foreach (var appName in apps)
                {
                    Debug.WriteLine("Get Job for Application: " + appName, "DBJobQueue.GetNext");

                    if (String.IsNullOrEmpty(simulationName))
                    {
                        job = db.Jobs.OrderByDescending(j => j.Submit).
                              Where(j => j.State == "submit" && j.ConsumerId == run.ConsumerId &&
                                    j.Simulation.ApplicationName == appName).FirstOrDefault();

                        if (job == null)
                        {
                            job = db.Jobs.OrderByDescending(j => j.Submit).
                                  Where(j => j.State == "submit" && j.ConsumerId == null &&
                                        j.Simulation.ApplicationName == appName).FirstOrDefault();
                        }
                    }
                    else
                    {
                        job = db.Jobs.OrderByDescending(j => j.Submit).
                              Where(j => j.State == "submit" && j.ConsumerId == run.ConsumerId &&
                                    j.Simulation.Name == simulationName && j.Simulation.ApplicationName == appName).FirstOrDefault();

                        if (job == null)
                        {
                            job = db.Jobs.OrderByDescending(j => j.Submit).
                                  Where(j => j.State == "submit" && j.ConsumerId == null &&
                                        j.Simulation.Name == simulationName && j.Simulation.ApplicationName == appName).FirstOrDefault();
                        }
                    }

                    var consumer = db.Consumers.Single(c => c.Id == run.ConsumerId);
                    if (job != null)
                    {
                        job.State    = "locked";
                        job.Consumer = consumer;
                        db.SaveChanges();
                        contract = new ConsumerJobContract(job.Count, run.ConsumerId);
                        Debug.WriteLine(String.Format("Found Job({0}): {1},{2}", job.Id, job.Simulation.Name, job.Simulation.ApplicationName), "DBJobQueue.GetNext");
                        break;
                    }
                }
            }
            return(contract);
        }