Giter Site home page Giter Site logo

ncronjob's Introduction

NCronJob

logo
Scheduling made easy

.NET NuGet NuGet

NCronJob

A Job Scheduler sitting on top of IHostedService in .NET.

Often, one finds oneself between the simplicity of BackgroundService/IHostedService and the complexity of a full-blown scheduler like Hangfire or Quartz. This library aims to fill that gap by providing a simple and easy-to-use job scheduler that can be used in any .NET application and feels "native".

There's no need to set up a database—just schedule your tasks right away! The library provides two ways of scheduling jobs:

  1. Instant jobs - Run a job immediately (or with a small delay, or at a specific date and time).
  2. Cron jobs - Schedule a job using a cron expression.

The whole documentation can be found here: NCronJob Documentation

Features

  • The ability to schedule jobs using a cron expression.
  • The ability to instantly run a job.
  • Parameterized jobs - Instant as well as cron jobs!
  • Integration with ASP.NET - Access your DI container like you would in any other service.
  • Get notified when a job is done (either successfully or with an error).
  • Retries - If a job fails, it will be retried.
  • The job scheduler supports TimeZones. Defaults to UTC time.
  • Minimal API for Jobs - Implement jobs in a one-liner.
  • Startup jobs - Run a job when the application starts.
  • Define job dependencies - trigger another job if one was successful or faulted!
  • Add, remove, and update jobs at runtime.

Not features

As this is a simple scheduler, some features are not included by design. If you need these features, you might want to look into a more advanced scheduler like Hangfire or Quartz.

  • Job persistence - Jobs are not persisted between restarts of the application.
  • Job history - There is no history of jobs that have been run.
  • Progress state - There is no way to track the progress of a job. The library supports notifying when a job is done, but not the progress of the job itself.

Short example

There are two ways to define a job.

Minimal Job API

You can use this library in a simple one-liner:

builder.Services.AddNCronJob((ILoggerFactory factory, TimeProvider timeProvider) =>
{
    var logger = factory.CreateLogger("My Anonymous Job");
    logger.LogInformation("Hello World - The current date and time is {Time}", timeProvider.GetLocalNow());
}, "*/5 * * * * *");

With this simple lambda, you can define a job that runs every 5 seconds. Pass in all dependencies, just like you would with a Minimal API.

Via the IJob interface

  1. Import the namespace (or let your IDE do the dirty work)
using NCronJob;
  1. Create a job
public class PrintHelloWorld : IJob
{
    private readonly ILogger<PrintHelloWorld> logger;

    public PrintHelloWorld(ILogger<PrintHelloWorld> logger)
    {
        this.logger = logger;
    }

    public Task RunAsync(JobExecutionContext context, CancellationToken token)
    {
        logger.LogInformation("Hello World");
        logger.LogInformation("Parameter: {Parameter}", context.Parameter);

        return Task.CompletedTask;
    }
}
  1. Register the NCronJob and the job in your Program.cs
builder.Services.AddNCronJob(options =>
    options.AddJob<PrintHelloWorld>(j => 
    {
        // Every minute and optional parameter
        j.WithCronExpression("* * * * *")
         .WithParameter("Hello World");
    }));
  1. Run your application and see the magic happen!

Triggering an instant job

If the need arises and you want to trigger a job instantly, you can do so:

public class MyService
{
  private readonly IInstantJobRegistry jobRegistry;
  
  public MyService(IInstantJobRegistry jobRegistry) => this.jobRegistry = jobRegistry;

  public void MyMethod() => jobRegistry.RunInstantJob<MyJob>("I am an optional parameter");
    
  // Alternatively, you can also run an anonymous job
  public void MyOtherMethod() => jobRegistry.RunInstantJob((MyOtherService service) => service.Do());
}

Running a Job at Startup

If you want a job to run when the application starts, you can configure it to run at startup using the RunAtStartup method. Here is an example:

builder.Services.AddNCronJob(options =>
{
    options.AddJob<MyJob>()
           .RunAtStartup();
});

In this example, the job of type 'MyJob' will be executed as soon as the application starts. This is useful for tasks that need to run immediately upon application startup, such as initial data loading or cleanup tasks.

Defining Job Dependencies

First you need to import data and then transform it? Well, but how do you make sure that the data is imported before you transform it? Sure, you could just give a delay, but what if the import takes longer than expected? This is where job dependencies come in handy!

builder.Services.AddNCronJob(options =>
{
    options.AddJob<ImportData>(p => p.WithCronExpression("0 0 * * *")
     .ExecuteWhen(
        success: s => s.RunJob<TransformData>("Optional Parameter"),
        faulted: s => s.RunJob<Notify>("Another Optional Parameter"));
});

You just want to trigger a service and don't want to define a whole new job? No problem! The Minimal API is available here as well:

builder.Services.AddNCronJob(options =>
{
    options.AddJob<ImportData>(p => p.WithCronExpression("0 0 * * *")
     .ExecuteWhen(
        success: s => s.RunJob(async (ITransformer transformer) => await transformer.TransformDataAsync()),
        faulted: s => s.RunJob(async (INotificationService notifier) => await notifier.NotifyAsync())
});

Support & Contributing

Thanks to all contributors and people who are creating bug reports and valuable input:

Supporters

If you have any questions or suggestions, feel free to open a new issue or pull request. Do you want to contribute? Great! We have a predefined codespace for you to get started right away! With that you don't need any local setup and can start right away! Either coding or updating the documentation - everything is set and done for you!

Open in GitHub Codespaces

ncronjob's People

Contributors

linkdotnet avatar falvarez1 avatar dependabot[bot] avatar dosper7 avatar skarum avatar

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.