Hi,
In my environment I delegate such "long running" activities to a job scheduler. In the process definition I use "User Task" activities whenever I want to model a external job execution. The external job scheduler can then use the REST api or use a different Activiti engine instance (which points to the same DB, of course) in order to acquire jobs. Once the job is complete, you use the "Task Service" API to inform Activiti that the user task is complete, and your process instance moves on.
This approach has the following advantages:
* No database transaction timeout
* Better scalability
* The external task can be assigned to a a dedicated node, leading to better resource utilization.
* Easier recovery from system errors
The downsize is the extra complexity of running a separate job scheduler, but, IMO, I think it pays off.