Maybe you could use asynchronous tasks to do the clean up. You could have a CleanUp
component that offers @Asnyc annotated methods. The TaskExecutors implicitly use a Queue for pending tasks (like plain Java's ExecutorService). There would also be the option to collect submitted clean up requests in a Queue and let them be processed by a scheduled task.
Another alternative may be Guava's EventBus. Setting one up wth spring should be straight forward and there is an AsynchronousEventBus available.