Hi again.
First of all, sorry about the previous messages, with the strange character 
codes. I hope this message doesn't have those in it.
Second, I have found the place in OpenEJB that causes the problems for me. 
Please see the comments in the code (that I have added)!

public class Memoizer<K, V> implements Computable<K, V> {
        private final ConcurrentMap<K, Future<V>> cache = new 
ConcurrentHashMap<K, Future<V>>();

        private final Computable<K, V> c;

        public Memoizer(Computable<K, V> c) {
                this.c = c;
        }

    // This method causes the NullPointerException and will
    // loop forever when that happens.
        public V compute(final K key) throws InterruptedException {
                while (true) {
                        Future<V> future = cache.get(key);
                        // When arriving here, future will not be null.
                        if (future == null) {

                                Callable<V> eval = new Callable<V>() {
                                        public V call() throws Exception {
                                                return c.compute(key);
                                        }
                                };
                                FutureTask<V> futureTask = new 
FutureTask<V>(eval);
                                future = cache.putIfAbsent(key, futureTask);
                                if (future == null) {
                                        future = futureTask;
                                        futureTask.run();
                                }
                        }
                        try {
                             // The NullPointerException occurs when calling
                             // future.get()
                                return future.get();
                        } catch (ExecutionException e) {
                             // So, finally, we arrive here and print the 
stacktrace
                             // and go back for another NullPointerException...
                                e.printStackTrace();
                        }
                }
        }
}

If the above class were to let the exception propagate out, then it would 
eventually reach the WebappClassLoader.clearReferences() in Tomcat and the 
clearing of static and final fields in that particular class would be skipped 
and the only "problem" I would have would be a stacktrace in the Tomcat log.
So how about it, OpenEJB people, is this fixable?
Best regards,
 Ivan A Krizsan

Reply via email to