The main reason is that one of the component does not comply with the JBI spec.
A usual case is when the provider (target component) has not answered an InOut exchange or has not acked an InOnly exchange (all exchanges must be terminated by a DONE status or an ERROR status). For an InOut exchange, the consumer should ack the exchange when the answer is received back.
Note that the consumer must also pull messages from the DeliveryChannel (or implement MessageExchangeListener interface), so that the delivery channel will not be fulled of DONE exchanges.
See Writing lighweight components for more informations.