[Haskell-beginners] AMQP and nested exception handlers
Alex
alex323 at gmail.com
Tue May 12 05:23:22 UTC 2015
On Tue, 12 May 2015 08:15:28 +0300
Kostiantyn Rybnikov <k-bx at k-bx.com> wrote:
> Hi.
>
> I would suggest to separate data-extraction from request stage and
> data-sending one. Create a data-structure that will represent a thing
> you will want to send into RabbitMQ, and build it before you send
> anything. Then catch exceptions in IO-based layer to handle exception
> case.
>
> This way you won't need any evaluation tricks and will get all
> exceptions during that phase.
>
In my case, the HTTP request is immediately parsed and a data structure
representing the request is created. The request is forwarded to the
AMQP code which does the following:
publishMsg chan "" "the-queue"
newMsg { msgDeliveryMode = Just Persistent
, msgReplyTo = Just cbQueue
, msgBody = encode req
}
where "encode req" uses aeson to transform the data structure in to
JSON.
I tried to make the values which comprise the request data structure
strict (by prefixing them with `!'), but it does not seem to help.
> Cheers.
> 12 трав. 2015 05:11 "Alex" <alex323 at gmail.com> пише:
>
> > Hi:
> >
> > I am writing a small application which receives HTTP requests,
> > translates them to JSON, and queues the requests using RabbitMQ.
> >
> > I am using exceptions to handle extreme cases, such as when a
> > client's HTTP request lacks a critical header:
> >
> > lookupHeader :: RequestHeaders -> HeaderName -> Text
> > lookupHeader hs h = decodeUtf8 $ fromMaybe notFound
> > (lookup h hs)
> > where
> > notFound = throw $ MissingHeader $ decodeUtf8 $ original h
> >
> > The problem I am running in to is that the header isn't actually
> > looked up until I call the AMQP library's publishMsg function. If I
> > purposely do not supply a critical header, I get the following
> > error printed to the screen:
> >
> > ConnectionClosedException "ConnectionClosedException
> > \"UNEXPECTED_FRAME
> > - expected content header for class 60, got non content header frame
> > instead\""
> >
> > If I add the following line just above the publishMsg function (to
> > force evaluation), my exception handler is called successfully:
> >
> > print $ encode req
> >
> > As a result, I suspect that this is due to the fact that the "throw
> > MissingHeader" is getting captured by the AMQP library. What's the
> > best way to deal with this situation?
> >
> > --
> > Alex
> > _______________________________________________
> > Beginners mailing list
> > Beginners at haskell.org
> > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> >
--
Alex
More information about the Beginners
mailing list