Создано слишком много веток Smack Cache Executor - PullRequest
0 голосов
/ 06 декабря 2018

Версия Smack: 4.2.4

Когда большое количество сообщений (обычные сообщения и сообщения с задержкой отправки) поступает в клиент Android, smack создает 100 ~ 200 спящих потоков Smack Cache Executor.Этот внезапный поток потоков приводит к тому, что клиент Android перестает отвечать на запросы (ошибка ANR).

При обычных операциях было бы как минимум 2 потока Smack Cache Executor, и приложение работало бы в общей сложности 50-60 потоков.

Сообщения с типом задержки в автономном хранилище обрабатываются по протоколу «Flexible Offline Message Retrieval».Тем не менее, у сообщений с обычными сообщениями и сообщениями с задержкой, похоже, нет специального протокола, и нет четких решений для притока подсчета потоков.

Большое количество сообщений здесь относится к 600+ повторным сообщениям и обычным сообщениям, поступающим в течение нескольких секунд.

Любая помощь или совет по этому вопросу высоко ценится.Спасибо заранее!

Редактировать 1:

3 Прослушиватели строфы настраиваются при аутентификации подключения к XMPP.Один для Присутствия, один для Сообщения и один для IQ.Они следующие:

public void addPresenceStanzaListener(){
    if (presenceStanzaListener != null) {
        connection.removeSyncStanzaListener(presenceStanzaListener);
    }

    StanzaFilter presenceStanzaFilter = new StanzaTypeFilter(Presence.class);

    presenceStanzaListener = new StanzaListener() {
        @Override
        public void processStanza(Stanza packet) throws SmackException.NotConnectedException, InterruptedException {
        //Process presence stanza
        }
    };
    connection.addSyncStanzaListener(presenceStanzaListener, presenceStanzaFilter);
}

public void addMessageStanzaListener(){
    if (messageStanzaListener != null) {
        connection.removeSyncStanzaListener(messageStanzaListener);
    }

    StanzaFilter messageStanzaFilter = new StanzaTypeFilter(Message.class);
    messageStanzaListener = new StanzaListener() {
        @Override
        public void processStanza(Stanza packet) throws SmackException.NotConnectedException, InterruptedException {
        //Process message stanza
        }
    };

    connection.addSyncStanzaListener(messageStanzaListener, messageStanzaFilter);
}

public void addIQStanzaListener(){
    if (iqStanzaListener != null) {
        connection.removeSyncStanzaListener(iqStanzaListener);
    }

    StanzaFilter iqStanzaFilter = new StanzaTypeFilter(IQ.class);
    iqStanzaListener = new StanzaListener() {
        @Override
        public void processStanza(Stanza packet) throws SmackException.NotConnectedException, InterruptedException {
        //Process IQ stanza
        }  
    };

    connection.addSyncStanzaListener(iqStanzaListener, iqStanzaFilter);
}

Как вызывается увеличение количества потоков Smack Cache Ex:

  1. Отключение подключения к Интернету
  2. Спам 600+ сообщений
  3. Снова включить интернет-соединение (с этой точки зрения, с точки зрения ejabberd, клиент-андроид никогда не отключался от него)
  4. В момент подключения клиента к XMPP число потоков Smack Cache Ex увеличивается как минимум100.

1 Ответ

0 голосов
/ 06 декабря 2018

Вероятно, вы используете асинхронный слушатель строфы, когда вам следует использовать синхронные.

В конечном итоге вы должны быть в состоянии отследить точного слушателя (предполагая, что на самом деле вызвано StanzaListener, но даже это не проверено прямо сейчас), которое создает все эти темы.Если вы определили, что Smack настроил слушателя, то вам, вероятно, следует сообщить об этом как о проблеме на форумах сообщества Smack.Если вы настраиваете слушателя, то вы можете использовать синхронный слушатель или утилиту Smack AsyncButOrdered для уменьшения количества потоков.

...