purescript-amqp/src/Node/AMQP/Main.purs

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"