Hi folks, I work on Apache James, the JVM mail server, for some years.
We implemented our Mail Queue using ActiveMQ a long time ago. The code is not really nice and the performances are not great (if you are curious you can look at it here https://github.com/apache/james-project/tree/master/server/queue/queue-activemq ) James is using reactive streams more and more to enable good performances, so I decided to rewrite our ActiveMQ Mail Queue using Akka Stream. We start to have a working implementation using artemis core protocol but we fall today on an unexpected problem. For our streaming architecture, we take advantage of async handling of messages using a `MessageHandler`. We have a single thread source that receive messages from the driver and push them in a stream. We then have many subscribers (workers) to the stream because handling email is a heavy process. Finally, we ack each message individually when a worker succeed at handling the mail. This is the happy path and we found what we want in the driver API for this. However, we didn't found a way to handle the failure path: when a worker fails, we are supposed to "nack" the message individually to allow another worker to take it from the queue. The only thing we found is that we can rollback the entire session. As there's, by design, a single session open for the stream source, doing a rollback would nack some messages that are being process, right? We looked at the wire package to understand the protocol and didn't find any solution. Is there any solution to this specific issue? What would you advise us to do? Cheers, -- Matthieu Baechler
