Giter Site home page Giter Site logo

chroniton's Introduction

Build status NuGet

Synopsis

A library for running tasks(jobs) on schedules. It supports:

  • Strongly typed jobs with strongly typed parameters
  • Asynchronous execution
  • Running a single job on multiple schedules
  • Running Multiple jobs on a single schedule
  • Cron schedules
  • Run once and expiring schedules
  • Custom schedules
  • Limiting the number of threads on which work is done
  • Managing behaviors of jobs which run beyond their next scheduled time
  • Dependency Injection initialization
  • Full mocking for unit tests
  • .NET Core

See Wiki and Tutorial for more info. Official site here.

Code Example

    var singularity = Singularity.Instance;

    var job = new SimpleParameterizedJob<string>((parameter, scheduledTime) => 
        Console.WriteLine($"{parameter}\tscheduled: {scheduledTime.ToString("o")}"));

    var schedule = new EveryXTimeSchedule(TimeSpan.FromSeconds(1));

    var scheduledJob = singularity.ScheduleParameterizedJob(
        schedule, job, "Hello World", true); //starts immediately

    var startTime = DateTime.UtcNow.Add(TimeSpan.FromSeconds(5));

    var scheduledJob2 = singularity.ScheduleParameterizedJob(
        schedule, job, "Hello World 2", startTime);

    singularity.Start();

    Thread.Sleep(10 * 1000);

    singularity.StopScheduledJob(scheduledJob);

    Thread.Sleep(5 * 1000);

    singularity.Stop();

In the above example, here's what happens: The first job starts immediately and print's "Hello World" once every second. Five seconds later the second job starts and prints "Hello World2" every second. Five seconds later the first job stops and only the second job is running. Five seconds later, Stop() is called and the second job also stops. Notice the same job is used with multiple schedules with different parameters.

Coming Soon !!!

The above code works with the currently released version. A new version with serialization features is on the way and has been started. There will be some breaking changes. If you'd like to see some of the changes coming, check out the Serialization branch. The core logic for how jobs run will not change, but how jobs get added has. I'm personally very excited to be bringing these changes as it opens up a world of possibilites for the project.

Motivation

This project was inspired for the need to have a strongly typed .NET solution for running tasks on schedules.

Installation

in your nuget package manager:

Install-Package Chroniton

for .NET Core use:

Install-Package Chroniton.NetCore

Contributors

Created by : Leonard Sperry [email protected]

License

Licensed under the MIT License

Changes

V 1.0.3

  • Cron string support
  • XUnit
  • Simplified constructors for SimpleJob and SimpleParameterizedJob

V 1.0.2

  • Support for run once and expiring jobs

V 1.0.1

  • Simplified Singularity by removing one of the main loops.
  • Added .NET Core support

Future Features

  • Serialization
  • Distributed execution

Notes

Unfortunately, .NET Core projects do not yet support referencing Shared Code projects. Therefore, the .NET Core projects in this solution reference all the files in the shared projects directly.

chroniton's People

Contributors

leosperry avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

chroniton's Issues

A Little Suggestion About Singularity.jobEnd Method

origin codes below:

Task task = null;
            if (jobTask.Exception == null)
            {
                task=Task.Run(() => _onSuccess?.Invoke(new ScheduledJobEventArgs(job)));
            }
            else
            {
                task=Task.Run(() => _onJobError?.Invoke(new ScheduledJobEventArgs(job),
                    jobTask.Exception is AggregateException? jobTask.Exception.InnerException : jobTask.Exception));
            }
            task.ContinueWith(t =>
            {
                _tasks.Remove(jobTask);
                setNextExecution(job);
            });

suggestion codes below:

Task task = null;
            if (jobTask.Exception == null)
            {
                task=Task.Run(() => _onSuccess?.Invoke(new ScheduledJobEventArgs(job)));
            }
            else
            {
                task=Task.Run(() => _onJobError?.Invoke(new ScheduledJobEventArgs(job),
                    jobTask.Exception is AggregateException? jobTask.Exception.InnerException : jobTask.Exception));
            }
            task.ContinueWith(t =>
            {
                _tasks.Remove(jobTask);
                setNextExecution(job);
            });

Because Task is async,so when HandleError or HandleSuccess method complete after setNextExecution,
ScheduledJob.RunTime maybe next scheduleTime,but last ScheduledJob.RunTime works for me.
tank u for your attention.

How to use JobExceptionHandler's

Hi there,

Thanks for the nice project!

I've got some troubles in using JobExceptionHandler.

I tried to use OnJobError and OnScheduleError

            _singularity.OnJobError += HandlerError;
            _singularity.OnScheduleError += HandlerError;

Whereas HandlerError is private class instance method or static class method. Neither works for me. Methods are not called.

I'm also using custom error reporting library to log exception to Sentry. So, there is some dependency I need to pass into HandlerError

It would be nice to have a sample of error handling.

DotNet Core support?

Hello.
Can I use this package in DotNet Core 2?
If I can please tell me which package should I install?

CronDateFinder - ArgumentOutOfRangeException if input second is 59

This line

DateTime retVal = new DateTime(

DateTime retVal = new DateTime( input.Year, input.Month, input.Day, input.Hour, input.Minute, input.Second + 1);

cause an Exception if the input DateTime has seconds set to 59,:

System.ArgumentOutOfRangeException: Hour, Minute, and Second parameters describe an un-representable DateTime. at System.DateTime.TimeToTicks(Int32 hour, Int32 minute, Int32 second)

I suggest you to use AddSecond() function instead

DateTime retVal = new DateTime( input.Year, input.Month, input.Day, input.Hour, input.Minute, input.Second ); retVal = retVal.AddSeconds(1);

ReaderWriterLockSlim requires disposing

ConcurrentHashSet uses ReaderWriterLockSlim which implements IDisposable. This and consumers like Singularity therefore needs to be marked as IDisposable, so this can be correctly cleaned up.

Dependency Injection Problem - SignalR with Chroniton

I'm using chroniton to run my jobs. Also those jobs need to send message to SignalR clients which is grouped. But any how it is not sending.

Here is my job

namespace Logic.Logics
{
    public class JobLogic : IJobLogic
    {
        private readonly IUnitOfWork unitOfWork;
        IHubContext<MyHub> hubContext;

        public JobLogic(
            IUnitOfWork unitOfWork,
            IHubContext<MyHub> hubContext,
        )
        {
            this.unitOfWork = unitOfWork;
            this.hubContext = hubContext;
        }

        public void UpdateCredidJob()
        {
            this.unitOfWork.User.DecreaseCredit();
            this.NotifiyVehicles();
        }

        private void NotifiyVehicles() {

            var vehicles = this.unitOfWork.Vehicle.GetAll();
            foreach(Vehicle v in vehicles) {
                Vehicle vehicle = this.unitOfWork.Vehicle.GetByLicensePlate(v.LicensePlate);
                VehicleViewModel vm = Mapper.Map<VehicleViewModel>(vehicle);
                this.hubContext.Clients.Group("OwnVehicle"+vm.LicensePlate).SendAsync("ReceiveVehicle",vm).Wait();
            }
        }
    }
  }

scheduling the job with chroniton and adding signalR in Startup.cs

    public void ConfigureServices(IServiceCollection services)
     {
        ...
        services.AddSignalR(o=>{
            o.EnableDetailedErrors = true;
        });
    
        var serviceProvider = services.BuildServiceProvider();
        var singularity = Singularity.Instance;
        singularity.Start();
        singularity.ScheduleJob(
            new CronSchedule("0 0 0 * * * *"),
            new SimpleJob(
                dt=>{
                    IJobLogic jobRunner = (IJobLogic) serviceProvider.GetService<IJobLogic>();
                    jobRunner.DailyCredidJob();
                }
            ),
            false
            );
    ...
    }
    
    
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IServiceProvider serviceProvider, PostgreSqlContext postgreSqlContext)
   {
    ...
       app.UseEndpoints(endpoints =>
       {
           endpoints.MapHub<MyHub>("/my-hub");
       });
    ...
    }

As you see I'm sending message to a group which start with OwnVehicle and clients invokes JoinOwnVehicle in order to joint that group.

public class MyHub : Microsoft.AspNetCore.SignalR.Hub
{
        ...
        public async Task JoinOwnVehicle() {
            await Groups.AddToGroupAsync(Context.ConnectionId, "OwnVehicle"+this.RequestedVehicle.LicensePlate);
        }
        ...
}

But job can not send message to group clients. I'm sure that clients can join to groups because when I try to send message in a controller it works.

Probably DI doesn't work properly, I'm doing a mistake.

Can you help me about this issue?

Details

I'm using .NET Core 5.0 and Chroniton version is 1.0.3.3

Scheduling async jobs

Whilst the scheduling is working in an asynchronous fashion, often the jobs themselves are asynchronous. For example:

async (id, dt) =>
{
    await somethingAsync();
}

One of the serious dangers, is that the job will accept this lambda and then treat as fire-and-forget. By overloading the jobs to accept a Func it will be processed correctly through the scheduler.

Stopping in progress jobs

How does this library cater for jobs that are in progress when a Stop is initiated. It would be great to have a mechanism like Task StopAndWait() that stops all scheduled jobs allows all in progress jobs to finish. Is this possible here?

Make Tutorial less superfical

Right now the example and tutorial gives little guidance on how to use this in a real world application.
You say:

Construct an IJob The library has a SimpleJob and SimpleParameterizedJob built for you which take Action in their constructors. You can also create your own IJob implementation.

but chances are those 2 jobs, SimpleJob and SimpleParameterizedJob, are not going to be of much use. Just saying "You can also create your own IJob implementation" doesn't help , the tutorial should show how to do this.

Same issue where you say :

Construct an ISchedule You can use one of the built in schedules or create your own ISchedule.

Again show us HOW to create your own ISchedule.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.