So I have a service set up to import a large amount of data from a file the user uploads. I want to the user to be able to continue working on the site while the file is being p
Another way to do this is to use Spring's @Async
annotation.
Add the following to resources.groovy
:
beans = {
xmlns task:"http://www.springframework.org/schema/task"
task.'annotation-driven'('proxy-target-class':true, 'mode':'proxy')
}
Any service method you now annotate with @Async
will run asynchronously, e.g.
@Async
def reallyLongRunningProcess() {
//do some stuff that takes ages
}
If you only want one thread to run the import at a time, you could do something like this -
class MyService {
boolean longProcessRunning = false
@Async
def reallyLongRunningProcess() {
if (longProcessRunning) return
try {
longProcessRunning = true
//do some stuff that takes ages
} finally {
longProcessRunning = false
}
}
}