{-# 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