Skip to content

Commit d9ffc13

Browse files
Port tutorial 5 to Haskell
1 parent 474b10d commit d9ffc13

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

haskell/emitLogTopic.hs

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
{-# OPTIONS -XOverloadedStrings #-}
2+
3+
import Network.AMQP
4+
import qualified Data.ByteString.Lazy.Char8 as BL
5+
import qualified Data.Text as DT
6+
import System.Environment (getArgs)
7+
import Text.Printf
8+
9+
logsExchange = "topic_logs"
10+
11+
main :: IO ()
12+
main = do
13+
args <- getArgs
14+
let body = bodyFor args
15+
severity = severityFor args
16+
conn <- openConnection "127.0.0.1" "/" "guest" "guest"
17+
ch <- openChannel conn
18+
19+
declareExchange ch newExchange {exchangeName = logsExchange,
20+
exchangeType = "topic",
21+
exchangeDurable = False}
22+
publishMsg ch logsExchange (DT.pack severity)
23+
(newMsg {msgBody = (BL.pack body),
24+
msgDeliveryMode = Just NonPersistent})
25+
26+
putStrLn $ printf " [x] Sent '%s'" (body)
27+
closeConnection conn
28+
29+
30+
bodyFor :: [String] -> String
31+
bodyFor [] = "Hello, world!"
32+
bodyFor xs = unwords $ tail xs
33+
34+
35+
severityFor :: [String] -> String
36+
severityFor [] = "anonymous.info"
37+
severityFor xs = head xs

haskell/receiveLogsTopic.hs

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
{-# OPTIONS -XOverloadedStrings #-}
2+
3+
import Network.AMQP
4+
import qualified Data.ByteString.Lazy.Char8 as BL
5+
import qualified Data.Text as DT
6+
import System.Environment (getArgs)
7+
import Text.Printf (printf)
8+
import Control.Monad (forM)
9+
10+
logsExchange = "topic_logs"
11+
12+
main :: IO ()
13+
main = do
14+
conn <- openConnection "127.0.0.1" "/" "guest" "guest"
15+
ch <- openChannel conn
16+
severities <- getArgs
17+
18+
declareExchange ch newExchange {exchangeName = logsExchange,
19+
exchangeType = "topic",
20+
exchangeDurable = False}
21+
(q, _, _) <- declareQueue ch newQueue {queueName = "",
22+
queueAutoDelete = True,
23+
queueDurable = False}
24+
forM severities (\s -> bindQueue ch q logsExchange (DT.pack s))
25+
26+
putStrLn " [*] Waiting for messages. to Exit press CTRL+C"
27+
consumeMsgs ch q Ack deliveryHandler
28+
29+
-- waits for keypresses
30+
getLine
31+
closeConnection conn
32+
33+
deliveryHandler :: (Message, Envelope) -> IO ()
34+
deliveryHandler (msg, metadata) = do
35+
putStrLn $ printf " [x] %s:%s" (DT.unpack $ envRoutingKey metadata) body
36+
putStrLn $ " [x] Done"
37+
ackEnv metadata
38+
where
39+
body = (BL.unpack $ msgBody msg)

0 commit comments

Comments
 (0)