@@ -12,12 +12,6 @@ defmodule Quantum.ExecutionBroadcaster do
1212
1313 alias Quantum.ClockBroadcaster.Event , as: ClockEvent
1414
15- alias Quantum . {
16- DateLibrary ,
17- DateLibrary.InvalidDateTimeForTimezoneError ,
18- DateLibrary.InvalidTimezoneError
19- }
20-
2115 alias Quantum.ExecutionBroadcaster.Event , as: ExecuteEvent
2216 alias Quantum.ExecutionBroadcaster.InitOpts
2317 alias Quantum.ExecutionBroadcaster.State
@@ -202,7 +196,7 @@ defmodule Quantum.ExecutionBroadcaster do
202196 } = state ,
203197 time
204198 ) do
205- case NaiveDateTime . compare ( time , time_to_execute ) do
199+ case DateTime . compare ( time , time_to_execute ) do
206200 :gt ->
207201 raise "Jobs were skipped"
208202
@@ -226,7 +220,7 @@ defmodule Quantum.ExecutionBroadcaster do
226220 jobs
227221 |> Enum . reduce (
228222 % { state | execution_timeline: tail } ,
229- & add_job_to_state ( & 1 , & 2 , NaiveDateTime . add ( time , 1 , :second ) )
223+ & add_job_to_state ( & 1 , & 2 , DateTime . add ( time , 1 , :second ) )
230224 )
231225 |> sort_state
232226 |> execute_events_to_fire ( time )
@@ -240,11 +234,17 @@ defmodule Quantum.ExecutionBroadcaster do
240234 state ,
241235 time
242236 ) do
243- job
244- |> get_next_execution_time ( time )
245- |> case do
246- { :ok , date } ->
247- add_to_state ( state , time , date , job )
237+ with { :ok , execution_date } <- get_next_execution_time ( job , time ) do
238+ add_to_state ( state , time , execution_date , job )
239+ else
240+ { :error , :time_zone_not_found } ->
241+ Logger . error (
242+ "Invalid Timezone #{ inspect ( timezone ) } provided for job #{ inspect ( name ) } ." ,
243+ job: job ,
244+ error: :time_zone_not_found
245+ )
246+
247+ state
248248
249249 { :error , _ } ->
250250 Logger . warning ( fn ->
@@ -256,54 +256,32 @@ defmodule Quantum.ExecutionBroadcaster do
256256
257257 state
258258 end
259- rescue
260- e in InvalidTimezoneError ->
261- Logger . error (
262- "Invalid Timezone #{ inspect ( timezone ) } provided for job #{ inspect ( name ) } ." ,
263- job: job ,
264- error: e
265- )
266-
267- state
268259 end
269260
270261 defp get_next_execution_time (
271- % Job { schedule: schedule , timezone: timezone , name: name } = job ,
262+ % Job { schedule: schedule , timezone: :utc } ,
272263 time
273264 ) do
274- schedule
275- |> CrontabScheduler . get_next_run_date ( DateLibrary . to_tz! ( time , timezone ) )
276- |> case do
277- { :ok , date } ->
278- { :ok , DateLibrary . to_utc! ( date , timezone ) }
265+ CrontabScheduler . get_next_run_date ( schedule , time )
266+ end
279267
280- { :error , _ } = error ->
281- error
268+ defp get_next_execution_time (
269+ % Job { schedule: schedule , timezone: timezone } ,
270+ time
271+ ) do
272+ with { :ok , localized_time } <- DateTime . shift_zone ( time , timezone ) ,
273+ { :ok , localized_execution_time } <-
274+ CrontabScheduler . get_next_run_date ( schedule , localized_time ) do
275+ DateTime . shift_zone ( localized_execution_time , "Etc/UTC" )
282276 end
283- rescue
284- _ in InvalidDateTimeForTimezoneError ->
285- next_time = NaiveDateTime . add ( time , 60 , :second )
286-
287- Logger . warning ( fn ->
288- """
289- Next execution time for job #{ inspect ( name ) } is not a valid time.
290- Retrying with #{ inspect ( next_time ) }
291- """
292- end )
293-
294- get_next_execution_time ( job , next_time )
295277 end
296278
297279 defp sort_state ( % State { execution_timeline: execution_timeline } = state ) do
298- % {
299- state
300- | execution_timeline:
301- Enum . sort_by ( execution_timeline , fn { date , _ } -> NaiveDateTime . to_erl ( date ) end )
302- }
280+ % { state | execution_timeline: Enum . sort_by ( execution_timeline , & elem ( & 1 , 0 ) , DateTime ) }
303281 end
304282
305283 defp add_to_state ( % State { execution_timeline: execution_timeline } = state , time , date , job ) do
306- unless NaiveDateTime . compare ( time , date ) in [ :lt , :eq ] do
284+ unless DateTime . compare ( time , date ) in [ :lt , :eq ] do
307285 raise Quantum.ExecutionBroadcaster.JobInPastError
308286 end
309287
0 commit comments