Actual message infrastructure channel, e.g. RabbitChannel
NullMessageChannel (to notify consumer when a timeout occurs and no message is received)
IdempotentChannel (channel itself must be multi-threaded and prevent duplicates)
PoisonMessageDeliveryHandler (handles exceptions?)
PooledDispatchDeliveryHandler (this is only for outbound, so it really isn't a delivery handler)
RoutingTableDeliveryHandler (combine DefaultDeliveryHandler and DefaultChannelMessageHandler)
Now messages are routed to appropriate message handlers...
Also, we need a UnitOfWorkDeliveryHandler (just before the DependecyResolverDeliveryHandler) to ensure that a ChannelTransaction exists and is completed/committed at the end of the associated work. Lastly, we could also add a TransactionScopeDeliveryHandler into the pipeline just after the UnitOfWorkDeliveryHandler (and even register complete with the transaction...
We also want something that logs any exceptions that occur--perhaps the PoisonMessageDeliveryHandler which logs the full exception and then determines whether or not the message is poison...
The IdempotentChannel not only needs to watch for unique values coming in while it's currently processing, but also keep track for a while thereafter, up to X message IDs. Finally, if the message is deferred, it should no longer track the ID of the message.