The optimal solution to this question depends in part on how much work the scheduled task will do.
One thing that is often overlooked when putting heavy-duty batch logic into web applications is that long-running processes can hold the entire appserver hostage, since if an emergency arises and the appserver needs to be restarted (or even just scheduled maintenance), you have to choose between killing the batch process or waiting for it to complete.
In any event, DON'T spawn the batch process thread from a web HTTP request. Do it in a servlet's init() method. Request processors, per the J2EE spec are forbidden from spawning threads. And with good reason, since the parent thread is going back into the pool and if a subsequent request scheduled under that thread fails, it will end up killing the batch thread as well. Or, at a minimum, you're violated the idea that one pool thread is as good as any other pool thread. The Quartz scheduler is also good here, as it has its own resources, and doesn't depend on the HTTP thread pool.
About the simplest way to run a process on schedule is to use the language Timer resources, but if the exact launch time is critical, some care needs to be observed on how the next request is scheduled or the actual start time may drift.
Customer surveys are for companies who didn't pay proper attention to begin with.