The response is only returned if it is not being executed on the same thread as the JobLauncher.  This is determined by the provided TaskExecutor.  If a synchronous TaskExecutor implementation is provided...the response wouldn't be sent until the job completes.