-
-
Notifications
You must be signed in to change notification settings - Fork 41
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
.every
functions adding the ability to run a job every amount
in a given interval
#97
Closed
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
…ore corresponding job QueuesConfiguration now stores all ScheduleBuilderContainer s ScheduleBuilderContainer now store the `job: ScheduledJob`. AnyScheduledJobs are only made when they are needed, to prevent being made __before__ the container is populated with builders
ScheduleBuilderContainer renamed to ScheduleContainer because since the last commit, ScheduleContainer actually contains the `job` and this name is more appropriate
…edule should be done
Fixed an issue with setting values to _timeValue when. Previously when both the current _timeValue and the newValue were `.componentBased`, the current values of _timeValue were ignored and were not added to the newValue.
Now after call to `startScheduledJobs`, QueuesConfiguration will optimize the number of containers and will release unneeded containers, for a better memory management.
MahdiBM
changed the title
Apr 16, 2021
.every
functions adding the ability to run a schedule every amount
in a given interval
.every
functions adding the ability to run a job every amount
in a given interval
To make sure there are no problems
This reverts commit 82e84ea.
adding `initialDelay` for the generalized `every` function. fixed some typos as well with the help of the Xcode typo-finder.
The `continuously()` func schedules a task to be done again right-away, every time it is finished. Changing precision of the delay because scheduling with nanosecond precision is possible with the `every()` funcs
Going to #98 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
What does this PR add to the queues package?
This PR adds the ability to schedule a
ScheduledJob
to be run at different times in any interval. For example you can call the.every(_:in:)
functions like so.every(.seconds(5), in: .minutes(1))
and expect the schedule to be run every 5 seconds in a minute, indefinitely.Motivation
I've not only seen other people be looking for such option in a long time, but i myself have been looking forward to having such options as well. I also saw the open issue here on github, and saw tanner suggesting the syntax
.every
for a function which allows people do the same thing that i implemented. That led me to think about contributing to the package by implementing this feature myself.What exactly is implemented?
.every(_:in:underestimatedCount:)
to be able to flexibly schedule a task to be done every while in an interval. This function is declared in the classScheduleContainer.Builder
, which is the equivalent to theScheduleBuilder
class prior to this PR. Thisevery
function is declared inScheduleContainer
as well for more convenience.Secondly
,Minutely
andHourly
to schedule a task every input amount of times in those types' respective intervals.How was this implementations made possible?
When we want to schedule a job, we need to do like so:
app.queues.schedule(ScheduledJob())
which prior to this PR, would return a class
ScheduleBuilder
. We then can add time specifications tothe builder using the available functions like
.at(Date())
or.minutely().at(5)
. The first problem in the wayof implementing
.every
functions is that a builder is supposed to only contain one job and one time, and theScheduleBuilder
neither can contain more than one time for a job, nor can produce more schedules of its own kind which have different times than itself. To fix this, i came up with 2-3 different ways, and chose the one that you see. I decided to make a change as described below:ScheduleContainer
so it can contain more than one builder.ScheduleContainer
instead of the builder when users doapp.queues.schedule(_:)
What
ScheduleContainer
does is to hold multiple values ofScheduleContainer.Builder
, plus the job that the buildersare supposed to be scheduled with. So you'll see this in declaration of
ScheduleContainer
:I also changed
Builder
a little bit to hold a reference to its container, as well as using uuid to be able to identify buildersthat are in a container:
I also changed the way that a builder holds the time that it should be scheduled at, by introducing an enum:
TimeValue:
Now a builder can clean-ly hold its time. This also helps when calculating the
nextDate
.Another also, i declared convenience functions on top of
ScheduleContainer
which also avoids breaking people's codes.So as an example, the first function is in
Builder
, and the second one is inScheduleContainer
:One thing remaining, is that now that we have containers, one problem appears. The problem is that when we call
app.queues.schedule(JOB())
, theAnyScheduledJob
s must not be immediately created. Instead, they should be created after the user is done with adding their builders to the container. If the app tries to createAnyScheduledJob
s out of a container's job and builders immediately after the.schedule(_:)
call happens, when it checks for builders, it'll see an empty array and basically no jobs will be added to theQueuesConfiguration
. To tackle this i changed the scheduler to store all containers, and only calculateAnyScheduledJob
s when needed:This is the summary of what i've done. You can dig into the files more, and i've left some comments there as well. Feel free to ask any questions you might have, or point out any issues with this implementation.
My questions from those who check the code
These are basically the more-important things that i think i could improve:
ScheduleContainer.swift
line 338, IsunderestimatedCount
justified?.every
func always start from the current time. I don't think thats an issue, but what are your opinions?@discardableResult
behind the declarations of the.minutely
function. I removed that since i couldn't figure out why it was there. Was that a mistake?