As with most everything EJB, the biggest distinction between the two techniques is transactions. Timer EJBs are, well, EJBs, so each invocation will be a unique transaction, and the container will manage all of those details for you.
The thread, especially if created from within an EJB, will have an undetermined transactional state. Most containers associate a lot of context with the currently executing thread, especially transactional state, this is one reason (among others) that self made threads are a bad idea in an EJB container -- the containers context information can be missing or corrupted.
For an EJB Timer, you can readily create one that that fires every 15s, but you will need to keep track and cancel it manually after 30 minutes. You could use a ScheduleExpression to express the "every 15s for 30m" rule, but you'll still need to cancel the timer at the end (and it would frankly be more work to create that expression properly). It's easier to just put a start time in the Timers Info that tells it when it started, then it can terminate itself on the last run.
In the days before Java EE 6, Timers were persistent and survived container restarts (though NOT application redeploys). Now, the persistence is optional, so you'll need to pay attention to that detail.
If this method were to be triggered from the Web tier (and not the EJB tier), the threading restrictions are relaxed, or you could use the Quartz Timer.
But the EJB timers are pretty good, and better for Java EE 6. I would use the EJB Timer, but I'm comfortable with them and have worked with the harder-to-use pre-Java EE 6 ones for some time. If you're in the EJB tier for this whole process, I would certainly use them.