leosperry / chroniton Goto Github PK
View Code? Open in Web Editor NEWA library for running tasks(jobs) on schedules.
License: MIT License
A library for running tasks(jobs) on schedules.
License: MIT License
When creating a CronScheduled job it will always run straight away. Even when explicitly telling the schedule to not do so.
I think it is related to this line: https://github.com/leosperry/Chroniton/blob/master/ChronitonShared/Schedules/CronSchedule.cs#L19
Shouldn't scheduledJob.RunTime be DateTime.UtcNow to begin with in case of a Cron job? So it only gets triggered the next time the cron expressions is true? As of now it is DateTime.MinValue.
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.
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.
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.
Example DateTime.Now.Add(timeout)
. I need Utc, then it working normally, but I think it is better to convert it in Chroniton library.
(Env. DotNet Core)
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.
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
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?
EveryXTimeSchedule always runs immediately
This work is scheduled to start after cron string implementation
Hi @leosperry
Great work, nice and lightweight scheduler!
Could you provide an example of registering Chroniton and running it inside aspnetcore mvc project, with the framework provided dependency injection mechanism?
Thanks.
This line
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);
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.
Hello.
Can I use this package in DotNet Core 2?
If I can please tell me which package should I install?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.