30 minutes sure is a long time! The job executor threadpool could be an option, but if you have many of those long running tasks, I'm worrying the system will not function properly. The job executor threadpool is configurable (but not documented), so you should find the right balance.
The alternative is writing your own queue system: send a message to some queue, do the work somewhere externally and send a message back to a receive task in the process using the execution id. However, this is exactly what the job executor does, so my first take would be to use the job executor.