1 {-# LANGUAGE OverloadedStrings #-}
3 -- generic AMQP rpc server
4 import Control.Concurrent
5 import qualified Control.Exception as X
7 import qualified Data.ByteString.Char8 as BS
8 import Data.Map (singleton)
10 import qualified Data.Text as T
12 import Data.Version (showVersion)
14 import Network.AMQP.Types
15 import Network.AMQP.Utils.Connection
16 import Network.AMQP.Utils.Helpers
17 import Network.AMQP.Utils.Options
18 import Paths_amqp_utils (version)
19 import System.Environment
25 args <- getArgs >>= parseargs 'r'
27 (printparam "worker" $ fromJust $ fileProcess args)
28 (error "-X option required")
29 printparam "cleanup temp file" $ cleanupTmpFile args
30 let addiArgs = reverse $ additionalArgs args
31 printparam "client version" ["amqp-utils", showVersion version]
32 (conn, chan) <- connect args
33 addChannelExceptionHandler chan (X.throwTo tid)
35 printparam "prefetch" $ preFetch args
36 qos chan 0 (preFetch args) False
41 newQueue {queueExclusive = True, queueName = (T.pack $ tmpQName args)} >>=
42 (\(x, _, _) -> return x))
44 (fmap T.pack (qName args))
45 printparam "queue name" queue
46 if (currentExchange args /= "")
48 printparam "exchange" $ currentExchange args
49 bindQueue chan queue (T.pack $ currentExchange args) queue
58 (rpcServerCallback tid args addiArgs chan)
59 printparam "consumer tag" ctag
60 printparam "send acks" $ ack args
61 printparam "requeue if rejected" $ (ack args) && (requeuenack args)
62 hr "entering main loop"
63 sleepingBeauty >>= printparam "exception"
65 hr "connection closed"
68 ThreadId -> Args -> [String] -> Channel -> (Message, Envelope) -> IO ()
69 rpcServerCallback tid a addi c m@(msg, env) = do
70 let numstring = show $ envDeliveryTag env
71 hr $ "BEGIN " ++ numstring
73 (callbackoptions, callbackenv) <-
75 (printmsg Nothing m (anRiss a) now)
76 (\x -> X.throwTo tid (x :: X.IOException) >> return ([], []))
77 either (\e -> printparam "ERROR" (e :: X.IOException)) return =<<
88 hr $ "END " ++ numstring
95 (fromJust $ msgReplyTo msg)
98 , msgCorrelationID = msgCorrelationID msg
99 , msgTimestamp = msgTimestamp msg
100 , msgExpiration = msgExpiration msg
103 FieldTable $ singleton "exitcode" $ FVString $ BS.pack $ show e