eclipse-ee4j / eclipse-ee4j/jersey
Thread leak in ScheduledThreadPoolExecutorProvider subclasses
- Dominant language
- Java
- Stars
- 730
- Forks
- 382
- PR merge metrics
- No merged PRs in 30d
Description
Tomcat 8.0.52 complains about our custom `ScheduledThreadPoolExecutorProvider`:
WARNING [ContainerBackgroundProcessor[StandardEngine[Catalina]]]
org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads
The web application [...] appears to have started a thread named
[CustomScheduledThreadPoolExecutorProvider-0] but has failed to stop it.
This is very likely to create a memory leak. Stack trace of thread:
Our implementation is the following:
import org.glassfish.jersey.server.BackgroundScheduler;
import org.glassfish.jersey.spi.ScheduledThreadPoolExecutorProvider;
@BackgroundScheduler
public class CustomScheduledThreadPoolExecutorProvider extends ScheduledThreadPoolExecutorProvider {
public CustomScheduledThreadPoolExecutorProvider() {
super("CustomScheduledThreadPoolExecutorProvider");
}
public CustomScheduledThreadPoolExecutorProvider(String name) {
super(name);
}
@Override
protected ScheduledThreadPoolExecutor createExecutor(final int corePoolSize, final ThreadFactory threadFactory,
final RejectedExecutionHandler handler) {
return new ScheduledThreadPoolExecutor(5, threadFactory, handler);
}
}
Although its [`ScheduledThreadPoolExecutorProvider` superclass implements a `@PreDestroy` method](https://github.com/eclipse-ee4j/jersey/blob/master/core-common/src/main/java/org/glassfish/jersey/spi/ScheduledThreadPoolExecutorProvider.java#L92) it's not called by Jersey.
As far I see, `@PreDestroy` is only called for the `DefaultBackgroundSchedulerProvider` (see [`ServerExecutorProvidersConfigurator.java:53`](https://github.com/eclipse-ee4j/jersey/blob/master/core-server/src/main/java/org/glassfish/jersey/server/ServerExecutorProvidersConfigurator.java#L53)). The following workaround works:
@Override
public void dispose(final ExecutorService executorService) {
super.close();
}
Anyway, it's rather weird since `@PostConstruct` method works in our `CustomScheduledThreadPoolExecutorProvider`.
Contributor guide
Assessment
This issue has not been assessed yet.