I've popped a question up here:
http://stackoverflow.com/questions/8514725/obtaining-a-java-util-timer-or-equivalent-in-a-javaee-friendly-way-that-works-on
to see if I can get some broader input on the issue of portable timers.
... and boy am I glad I did, thanks to Bauke Scholtz (BalusC) on SO.
It looks like we can probably use a ScheduledThreadPoolExecutor safely from within a Java EE container or servlet container, so long as:
- We never let EE application code that requires EE services - like servlet code, EJBs, etc - run on its thread(s); and
- We use a ServiceLoader in /META-INF/services to destroy it when the JDBC driver is unloaded, the war
the JDBC driver is bundled in is undeployed or the app server is stopped;
That should provide the JDBC driver with a suitable timer mechanism.
Perhaps more excitingly, a generic ThreadPoolExecutor can be safely used within an EE container the same way, potentially allowing the JDBC driver to use threads for blocking I/O. That'd finally permit a version of PgConnection.getNotifications() that can be safely invoked without blocking when SSL is in use!
A driver thread pool could also help permanently fix those occasional deadlocks that happen due to buffer management issues in the JDBC driver.
I'll try to find time to do some testing and see if I can make this work or at least bash out a proof of concept.
--
Craig Ringer