Запустил поток с именем MultiThreadedHttpConnectionManager cleanup, но не смог остановить его - PullRequest
2 голосов
/ 23 мая 2011

Я пишу веб-приложение, используя Amazon Web Services AWS Java SDK.Apache commons HttpClient версии 3 используется за кулисами.У меня есть commons-httpclient-3.0.1.jar.

В моем catalina.out

SEVERE: The web application [/MyAppName] appears to have started a thread named
[MultiThreadedHttpConnectionManager cleanup] but has failed to stop it. This is 
very likely to create a memory leak.

у меня есть следующее предупреждение, поэтому я написал ServletContextListener с помощью метода contextDestroyed ():

MultiThreadedHttpConnectionManager.shutdownAll();

Тем не менее, предупреждение все еще отображается, несмотря на то, что метод был вызван.Что еще я должен сделать для обеспечения очистки?

EDIT : я хотел быть абсолютно уверен, что contextDestroyed () действительно вызывался (по предложению nos), поэтому я установил точку останова наПервое утверждение метода, остановка сервера и попадание в точку останова Я выполнил метод шаг за шагом, чтобы убедиться, что исключения не вызываются, и каждая строка метода была выполнена без проблем.Вот мой исходный код:

@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
    System.out.println("contextDestroyed() start");
    MyMemCache.shutDown();
    MultiThreadedHttpConnectionManager.shutdownAll();
    ClassLoader contextClassLoader=Thread.currentThread().getContextClassLoader();
    LogFactory.release(contextClassLoader);
    java.beans.Introspector.flushCaches();
    System.out.println("contextDestroyed() end");
}

При горячей замене:

INFO: Reloading Context with name [/MyAppName] has started
contextDestroyed() start
contextDestroyed() end
05 24, 11 3:11:00 PM org.apache.catalina.loader.WebappClassLoader 
    clearReferencesThreads
SEVERE: The web application [/MyAppName] appears to have started a thread 
    named [MultiThreadedHttpConnectionManager cleanup] but has failed to 
    stop it. This is very likely to create a memory leak.

Ответы [ 3 ]

2 голосов
/ 19 июня 2011

Обновление до AWS Java SDK версии 1.2.1 решило проблему. Когда я разместил вопрос, эта версия еще не была доступна, поскольку она была выпущена 26 мая 2011 года.

AWS SDK 1.2. * Использует HttpClient 4, выпущенный в 2009 году, но AWS Java SDK все еще использовал версию 3 в своих версиях 1.1. *. Я не буду вдаваться в подробности, чтобы проанализировать их изменения кода, так как моя проблема решена.

2 голосов
/ 17 июня 2011

Это ошибка в AWS SDK, когда они открывают два HttpClients и выключают только один из них. Моя проблема немного отличается тем, что я хочу запускать и останавливать клиентов для различных регионов и учетных записей без перезапуска веб-приложения.

Я обошел проблему (о которой я сообщил им, но они не склонны ее исправлять) с помощью:

public class MyAmazonEC2Client extends AmazonEC2AsyncClient {
    private boolean shutdownCalled = false;


    public MyAmazonEC2Client(final AWSCredentials awsCredentials) {
        super(awsCredentials);
    }


    public MyAmazonEC2Client(final AWSCredentials awsCredentials, final ClientConfiguration clientConfiguration) {
        this(awsCredentials, clientConfiguration, Executors.newCachedThreadPool());
    }


    public MyAmazonEC2Client(
                                 final AWSCredentials awsCredentials,
                                 final ClientConfiguration clientConfiguration,
                                 final ExecutorService executor) {
        super(awsCredentials, clientConfiguration, executor);
    }


    /**
     * Shuts down this client object, releasing any resources that might be held open.<br />
     */
    @Override
    public synchronized void shutdown() {
        try {
            shutdownCalled = true;

            // Call the proper shutdown method. This is in the base type and only shuts down one of the HttpClients created (the one that's never used)
            super.shutdown(); // close the HttpClient in AmazonWebServiceClient
        }
        finally {
            // Fix a bug in Amazon's implementation where they've duplicated the HttpClients
            try {
                super.client.shutdown(); // close the HttpClient in AmazonEC2Client
            }
            catch (Throwable t) {
                // ignore failures
            }
        }
    }
}
0 голосов
/ 19 февраля 2014

Я получил аналогичную ошибку и в веб-сервисе axis2 и обнаружил, что это ошибка в оси, которая исправлена ​​в версии axis2 1.6.

Хотя на этот вопрос и есть ответ для AWS, но я поставил свой ответ для парней, которые ищут похожую ошибку axis2.

...