Finally I used such a solution:
Code:
<jdbc:inbound-channel-adapter channel="batchDueNotificationsChannel"
data-source="dataSource"
select-sql-parameter-source="currentTimeMillisSqlParameterSource">
<jdbc:query>
select id, ... from Notification
where delayUntil < :CURRENT_TIME_MILLIS
</jdbc:query>
<jdbc:update>
delete Notification where id in (:id)
</jdbc:update>
<integration:poller fixed-delay="1000">
<integration:transactional isolation="SERIALIZABLE"
transaction-manager="delayTransactionManager"/>
</integration:poller>
</jdbc:inbound-channel-adapter>
Every time that multiple program instance retrived same rows from DB, all of them except one will have an errorMesssage with payload type SQLException (for oracle ORA-8177) that should be filtered from real errorMessages logging.
Haven't every body a better solution according to described requirements?