예제 #1
0
        public static async Task Main(string[] args)
        {
            //Create our actor system and JobManager for the print job
            var actorSystem = ActorSystem.Create("print-job-system", Configuration.Config);

            var jobManager = actorSystem.ActorOf(
                Props.Create(
                    () => new JobManager <PrintJobScheduler, PrintJobRunner, PrintJob, PrintJobId>(
                        (() => new PrintJobScheduler()),
                        () => new PrintJobRunner())));

            var jobId    = PrintJobId.New;
            var job      = new PrintJob("repeated job");
            var interval = TimeSpan.FromSeconds(10);
            var when     = DateTime.UtcNow;

            //Create a message that will Ack with [Success] and will fail with [Failed]
            var scheduleMessage = new ScheduleRepeatedly <PrintJob, PrintJobId>(jobId, job, interval, when)
                                  .WithAck(Success.Instance)
                                  .WithNack(Failed.Instance);

            var scheduled = await jobManager.Ask <PrintJobResponse>(scheduleMessage);

            var result = scheduled
                         .Match()
                         .With <Success>(x => Console.WriteLine("Job was Scheduled"))
                         .With <Failed>(x => Console.WriteLine("Job was NOT scheduled."))
                         .WasHandled;

            Console.ReadLine();
        }
예제 #2
0
        public void SchedulingJob_ForEvery5minutes_DispatchesJobMessage()
        {
            var probe       = CreateTestProbe("job-probe");
            var scheduler   = (TestScheduler)Sys.Scheduler;
            var jobId       = TestJobId.New;
            var greeting    = $"hi here here is a random guid {Guid.NewGuid()}";
            var job         = new TestJob(greeting);
            var when        = DateTime.UtcNow.AddDays(1);
            var fiveMinutes = TimeSpan.FromMinutes(5);
            Expression <Func <TestJobScheduler> > testJobSchedulerExpression = () => new TestJobScheduler();
            Expression <Func <TestJobRunner> >    testJobRunnerExpression    = () => new TestJobRunner(probe);

            var testJobManager = Sys.ActorOf(
                Props.Create(() =>
                             new JobManager <TestJobScheduler, TestJobRunner, TestJob, TestJobId>(
                                 testJobSchedulerExpression,
                                 testJobRunnerExpression))
                .WithDispatcher(CallingThreadDispatcher.Id));

            var schedule = new ScheduleRepeatedly <TestJob, TestJobId>(jobId, job, fiveMinutes, when)
                           .WithAck(TestJobAck.Instance)
                           .WithNack(TestJobNack.Instance);



            testJobManager.Tell(schedule, probe);
            probe.ExpectMsg <TestJobAck>();
            scheduler.AdvanceTo(when);



            probe.ExpectMsg <TestJobDone>(x =>
            {
                x.At.Should().BeCloseTo(when);
                return(x.Greeting == greeting);
            });
            scheduler.Advance(fiveMinutes);
            probe.ExpectMsg <TestJobDone>(x =>
            {
                x.At.Should().BeCloseTo(when.Add(fiveMinutes));
                return(x.Greeting == greeting);
            });
            scheduler.Advance(fiveMinutes);
            probe.ExpectMsg <TestJobDone>(x =>
            {
                x.At.Should().BeCloseTo(when.Add(fiveMinutes * 2));
                return(x.Greeting == greeting);
            });
        }