@BitGonzo is right. If you’re starting tasks you need to handle messages that they failed. Unless you have started the Task with start_child.
Not sure how far along you are, but stuff like this is handled in a framework I maintain called Conduit, which allows you to connect to rabbit.
Here’s an example of what it looks like to setup queues, exchanges, consumers, and pipelines: conduit_amqp_example/lib/conduit_amqp_example/broker.ex at master · conduitframework/conduit_amqp_example · GitHub
PM me if you’d like to know more. If you don’t want to use it, you might find the implementation of the AMQP adapter useful. Specifically, how it starts tasks for processing a message: