112 lines
3.9 KiB
Plaintext
112 lines
3.9 KiB
Plaintext
module Node.AMQP.Main where
|
|
|
|
import Node.AMQP
|
|
import Prelude
|
|
|
|
import Control.Monad.Aff (delay, runAff)
|
|
import Control.Monad.Eff (Eff, kind Effect)
|
|
import Control.Monad.Eff.Class (liftEff)
|
|
import Control.Monad.Eff.Console (CONSOLE, log, logShow)
|
|
import Control.Monad.Eff.Exception (EXCEPTION)
|
|
import Data.Maybe (Maybe(..))
|
|
import Data.StrMap as StrMap
|
|
import Data.Time.Duration (Milliseconds(..))
|
|
import Node.Buffer (BUFFER, fromString, toString)
|
|
import Node.Encoding (Encoding(..))
|
|
import Node.Process (PROCESS)
|
|
|
|
main :: forall eff. Eff ( console :: CONSOLE
|
|
, amqp :: AMQP
|
|
, exception :: EXCEPTION
|
|
, process :: PROCESS
|
|
, buffer :: BUFFER
|
|
| eff ) Unit
|
|
main = do
|
|
log "Starting"
|
|
content <- fromString "test123" UTF8
|
|
void $ runAff (\e -> log "ERRORAFF" *> logShow e) pure do
|
|
conn <- connect "amqp://localhost" defaultConnectOptions
|
|
liftEff $ log "Connected"
|
|
let q = "queue111"
|
|
x = "exc2222"
|
|
|
|
liftEff $ do
|
|
onConnectionClose conn $ case _ of
|
|
Just err -> log $ "E: Conn closed: " <> show err
|
|
Nothing -> log "E: Conn closed"
|
|
onConnectionError conn \err -> log $ "E: Conn errored: " <> show err
|
|
onConnectionBlocked conn \reason -> log $ "E: Conn blocked: " <> reason
|
|
onConnectionUnblocked conn (log "E: Conn unblocked")
|
|
|
|
withChannel conn \channel -> do
|
|
liftEff $ log "Channel created"
|
|
prefetch channel 10
|
|
|
|
liftEff $ do
|
|
onChannelClose channel (log "E: Channel close")
|
|
onChannelError channel \err -> log $ "E: Channel errored: " <> show err
|
|
onChannelReturn channel \msg ->
|
|
toString UTF8 msg.content >>= \m -> log $ "E: Channel message returned: " <> m
|
|
onChannelDrain channel (log "E: Channel drained")
|
|
|
|
ok <- assertQueue channel q defaultQueueOptions
|
|
liftEff $ log $ "Queue created: " <> ok.queue
|
|
|
|
consumeChannel <- createChannel conn
|
|
liftEff $ onChannelClose consumeChannel (log "E: Consume Channel close")
|
|
|
|
recover consumeChannel
|
|
|
|
ok <- consume consumeChannel q defaultConsumeOptions $ case _ of
|
|
Nothing -> do
|
|
log "Consumer closed"
|
|
void $ runAff logShow logShow $ closeChannel consumeChannel
|
|
Just msg -> do
|
|
toString UTF8 msg.content >>= \m -> log $ "Received: " <> m
|
|
ack consumeChannel msg.fields.deliveryTag
|
|
logShow msg.properties.persistent
|
|
|
|
let consumerTag = ok.consumerTag
|
|
liftEff $ log $ "Consumer tag: " <> ok.consumerTag
|
|
|
|
ok <- purgeQueue channel q
|
|
liftEff $ log $ "Queue purged: " <> show ok.messageCount
|
|
|
|
assertExchange channel x Fanout defaultExchangeOptions
|
|
liftEff $ log $ "Exchange created"
|
|
|
|
bindQueue channel q x "*" StrMap.empty
|
|
liftEff $ log $ "Queue bound"
|
|
|
|
publish channel x "" content $ defaultPublishOptions { persistent = Just false }
|
|
liftEff $ log $ "Message published to exchange"
|
|
|
|
delay (Milliseconds 500.0)
|
|
|
|
liftEff $ ackAll consumeChannel
|
|
cancel consumeChannel consumerTag
|
|
closeChannel consumeChannel
|
|
|
|
sendToQueue channel q content $ defaultPublishOptions { persistent = Just true }
|
|
liftEff $ log $ "Message published to queue"
|
|
|
|
delay (Milliseconds 500.0)
|
|
|
|
get channel q defaultGetOptions >>= case _ of
|
|
Nothing -> liftEff $ log "No message received"
|
|
Just msg -> liftEff do
|
|
toString UTF8 msg.content >>= \m -> log $ "Get Received: " <> m
|
|
nackAllUpTo channel msg.fields.deliveryTag true
|
|
|
|
unbindQueue channel q x "*" StrMap.empty
|
|
liftEff $ log $ "Queue unbound"
|
|
|
|
deleteExchange channel x defaultDeleteExchangeOptions
|
|
liftEff $ log $ "Exchange deleted"
|
|
|
|
ok <- deleteQueue channel q defaultDeleteQueueOptions
|
|
liftEff $ log $ "Queue deleted: " <> show ok.messageCount
|
|
|
|
close conn
|
|
liftEff $ log $ "Connection closed"
|