Существует простое руководство по использованию RabbitMQ для Haskell, где я взял этот кусок кода
main :: IO ()
main = do
conn <- openConnection "127.0.0.1" "/" "guest" "guest"
ch <- openChannel conn
declareQueue ch newQueue {queueName = "hello",
queueAutoDelete = False,
queueDurable = False}
putStrLn " [*] Waiting for messages. To exit press CTRL+C"
consumeMsgs ch "hello" NoAck deliveryHandler
-- waits for keypresses
getLine
closeConnection conn
deliveryHandler :: (Message, Envelope) -> IO ()
deliveryHandler (msg, metadata) =
BL.putStrLn $ " [x] Received " <> msgBody msg
. Оно просто объясняет, как получить сообщение из очереди и обработать его с помощью обратного вызова.
Одна вещь может быть проста для решения, но я изо всех сил пытаюсь понять, как добавить некоторый изменяемый контекст в обратный вызов, поэтому каждый раз, когда функция запускается, она может изменить ее.Просто, как рассчитать номер сообщения в порядке очереди.Я обнаружил, что возможным решением является государственная монада, не так ли?
И второй вопрос - все эти обратные вызовы обрабатываются параллельно или нет?Если нет, то как обрабатывать их параллельно и сохранять изменяемый контекст без гонки данных?