A queue with retries most of the time solves such issues. If your handler/aggregate/denormalizer can't process a message, because preconditions are not met - fail it hard. Then you'll process some more messages from the queue until this one becomes visible again. If message fails more than 3 times - discard it into error queue for further analysis.
If it's an expected workflow and you actually have to wait - create Saga if not modeling with DDD/Event Sourcing. If modeling with DDD/Event Sourcing - Aggregates will cover such functionality most of the time.