1
- {-# LANGUAGE DeriveGeneric #-}
2
1
{-# LANGUAGE MultiParamTypeClasses #-}
3
2
{-# LANGUAGE OverloadedStrings #-}
4
3
import Control.Concurrent (forkIO , killThread , threadDelay )
5
4
import Control.Concurrent.MVar (MVar , modifyMVarMasked_ , newMVar ,
6
5
readMVar , takeMVar )
6
+ import Control.Monad (replicateM )
7
7
import qualified Data.Text as T
8
8
import Data.Time.Calendar
9
9
import Data.Time.Clock
@@ -19,6 +19,10 @@ date y m d = UTCTime (fromGregorian y m d) 0
19
19
time :: UTCTime -> Int -> Int -> Int -> UTCTime
20
20
time t h m s = t { utctDayTime = fromIntegral $ h * 60 * 60 + m * 60 + s }
21
21
22
+ runNThreads :: Int -> Int -> Scheduler -> IO ()
23
+ runNThreads n delay sched = do threads <- replicateM n (forkIO $ run sched)
24
+ threadDelay delay
25
+ mapM_ killThread threads
22
26
main :: IO ()
23
27
main = hspec $
24
28
do describe " shouldRun" $
@@ -39,9 +43,8 @@ main = hspec $
39
43
scheduler <- create (Name " simple-1" ) rconn (CheckInterval (Seconds 1 )) (LockTimeout (Seconds 1000 ))
40
44
addTask scheduler " job" (Every (Seconds 100 )) (modifyMVarMasked_ mvar (return . (+ 1 )))
41
45
42
- wthread <- forkIO (run scheduler)
43
- threadDelay 30000
44
- killThread wthread
46
+ runNThreads 1 30000 scheduler
47
+
45
48
destroy scheduler
46
49
v <- takeMVar mvar
47
50
1 `shouldBe` v
@@ -50,13 +53,7 @@ main = hspec $
50
53
rconn <- R. connect R. defaultConnectInfo
51
54
scheduler <- create (Name " simple-2" ) rconn (CheckInterval (Seconds 1 )) (LockTimeout (Seconds 1000 ))
52
55
addTask scheduler " job" (Every (Seconds 100 )) (modifyMVarMasked_ mvar (return . (+ 1 )))
53
- wthread1 <- forkIO (run scheduler)
54
- wthread2 <- forkIO (run scheduler)
55
- wthread3 <- forkIO (run scheduler)
56
- threadDelay 100000
57
- killThread wthread1
58
- killThread wthread2
59
- killThread wthread3
56
+ runNThreads 3 100000 scheduler
60
57
destroy scheduler
61
58
v <- takeMVar mvar
62
59
v `shouldBe` 1
@@ -65,13 +62,7 @@ main = hspec $
65
62
rconn <- R. connect R. defaultConnectInfo
66
63
scheduler <- create (Name " simple-3" ) rconn (CheckInterval (Seconds 1 )) (LockTimeout (Seconds 1000 ))
67
64
addTask scheduler " job" (Every (Seconds 2 )) (modifyMVarMasked_ mvar (return . (+ 1 )))
68
- wthread1 <- forkIO (run scheduler)
69
- wthread2 <- forkIO (run scheduler)
70
- wthread3 <- forkIO (run scheduler)
71
- threadDelay 4000000
72
- killThread wthread1
73
- killThread wthread2
74
- killThread wthread3
65
+ runNThreads 3 4000000 scheduler
75
66
destroy scheduler
76
67
v <- takeMVar mvar
77
68
-- NOTE(dbp 2016-05-26): Precise timing is hard
@@ -83,9 +74,7 @@ main = hspec $
83
74
scheduler <- create (Name " simple-4" ) rconn (CheckInterval (Seconds 1 )) (LockTimeout (Seconds 1000 ))
84
75
seconds <- utctDayTime <$> getCurrentTime
85
76
addTask scheduler " job" (Daily (Time seconds)) (modifyMVarMasked_ mvar (return . (+ 1 )))
86
- wthread <- forkIO (run scheduler)
87
- threadDelay 4000000
88
- killThread wthread
77
+ runNThreads 1 4000000 scheduler
89
78
destroy scheduler
90
79
v <- takeMVar mvar
91
80
v `shouldBe` 1
@@ -96,9 +85,21 @@ main = hspec $
96
85
now <- getCurrentTime
97
86
let seconds = utctDayTime $ addUTCTime 3600 now
98
87
addTask scheduler " job" (Daily (Time seconds)) (modifyMVarMasked_ mvar (return . (+ 1 )))
99
- wthread <- forkIO (run scheduler)
100
- threadDelay 2000000
101
- killThread wthread
88
+ runNThreads 1 2000000 scheduler
102
89
destroy scheduler
103
90
v <- takeMVar mvar
104
91
v `shouldBe` 0
92
+ describe " error handling" $
93
+ do it " should keep running jobs if one throws an exception" $
94
+ do mvar <- newMVar 0
95
+ rconn <- R. connect R. defaultConnectInfo
96
+ scheduler <- create (Name " error-1" ) rconn (CheckInterval (Seconds 1 )) (LockTimeout (Seconds 1000 ))
97
+ addTask scheduler " job-error" (Every (Seconds 100 )) (error " blowing up" )
98
+ thread <- forkIO $ run scheduler
99
+ threadDelay 300000
100
+ addTask scheduler " job-success" (Every (Seconds 100 )) (modifyMVarMasked_ mvar (return . (+ 1 )))
101
+ threadDelay 2000000
102
+ killThread thread
103
+ destroy scheduler
104
+ v <- takeMVar mvar
105
+ 1 `shouldBe` v
0 commit comments