A clearer statement of the use cases would help, instead of concentrating on the implementation. Useful background reading can also be found here: http://static.springsource.org/spring-batch/cases/retry.html. Note that there are 2 independent general classes of retry (stateless and stateful), both described in that link, but note that one (stateful or external) is expressed as a variation of the other, which isn't particularly illuminating. Both are relevant to Spring Integration users.
Stateless retry (where an exception does not invalidate the current transaction, or there is no current transaction) can be simply implemented as advice around a MessageHandler. The POJO in a user-defined endpoint (and any vanilla <gateway/>) can already be wrapped in advice trivially using Spring AOP, so maybe all we need to provide is the interceptor and maybe some configuration sugar to make it easy to use. Note, however, that the important case of an outbound gateway like a web-service call is not covered by that implementation, so we may need to consider that as a special case.
Stateful retry is needed in the opposite case (an exception invalidates the current transaction), but can be supported only if there is a transaction and only if a rollback would result in redelivery. Retry features can be added to any handler or equivalently any channel in a transactional message pipeline formed (of course) from DirectChannels where there is an upstream JMS inbound adapter or a transactional poller. As far as implementation goes, the Spring JMS listener containers have rudimentary support for retry built in to them (too rudimentary for some clients but that's another story), so I believe we should concentrate on the poller (where advice is already supported, largely because we anticipated this use case in 1.0).
Assuming we don't want to depend on Spring Batch, and we also don't want to duplicate all the code there in the long term, we should probably adopt the approach Thomas is taking with database support and depend on a common library that can be shared between Batch, Integration and the database package(s).