[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