packages feed

amqp-worker-0.4.0: example/Example.hs

{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}

module Main where

import Control.Concurrent (forkIO)
import Control.Monad.Catch (SomeException)
import Data.Aeson (FromJSON, ToJSON)
import Data.Function ((&))
import Data.Text (Text, pack)
import GHC.Generics (Generic)
import Network.AMQP.Worker
    ( Connection
    , Message (..)
    , WorkerException
    , def
    , fromURI
    )
import qualified Network.AMQP.Worker as Worker
import Network.AMQP.Worker.Key
import System.IO
    ( BufferMode (..)
    , hSetBuffering
    , stderr
    , stdout
    )

data TestMessage = TestMessage
    {greeting :: Text}
    deriving (Generic, Show, Eq)

instance FromJSON TestMessage
instance ToJSON TestMessage

newMessages :: Key Routing TestMessage
newMessages = key "messages" & word "new"

results :: Key Routing Text
results = key "results"

anyMessages :: Key Binding TestMessage
anyMessages = key "messages" & star

example :: IO ()
example = do
    -- connect
    conn <- Worker.connect (fromURI "amqp://guest:guest@localhost:5672")

    let handleAnyMessages = Worker.topic anyMessages "handleAnyMessage"

    -- initialize the queues
    Worker.bindQueue conn (Worker.direct newMessages)
    Worker.bindQueue conn (Worker.direct results)

    -- topic queue!
    Worker.bindQueue conn handleAnyMessages

    putStrLn "Enter a message"
    msg <- getLine

    -- publish a message
    putStrLn "Publishing a message"
    Worker.publish conn newMessages (TestMessage $ pack msg)

    -- create a worker, the program loops here
    _ <- forkIO $ Worker.worker conn def (Worker.direct newMessages) onError (onMessage conn)
    _ <- forkIO $ Worker.worker conn def (handleAnyMessages) onError (onMessage conn)

    putStrLn "Press any key to exit"
    _ <- getLine
    return ()

onMessage :: Connection -> Message TestMessage -> IO ()
onMessage conn m = do
    let testMessage = value m
    putStrLn "Got Message"
    print testMessage
    Worker.publish conn results (greeting testMessage)

onError :: WorkerException SomeException -> IO ()
onError e = do
    putStrLn "Do something with errors"
    print e

main :: IO ()
main = do
    hSetBuffering stdout LineBuffering
    hSetBuffering stderr LineBuffering
    example