创建的Smack Cache执行器线程过多



Smack版本:4.2.4

当大量消息(正常消息和延迟重新发送消息(进入android客户端时,stack会创建100~200个睡眠的smack Cache执行器线程。线程的突然涌入导致android客户端变得没有响应(ANR错误(。

在正常操作下,将至少有2个Smack Cache Executor线程,并且应用程序将总共使用50-60个线程进行操作。

延迟离线存储类型的消息采用"灵活的离线消息检索"协议处理。然而,那些正常和延迟重新发送的消息似乎没有任何特殊的协议,也没有明确的线程数流入解决方案。

这里的大量消息指的是600多条重新发送消息和几秒内传入的正常消息。

我们非常感谢对此事的任何帮助或建议。非常感谢!

编辑1:

当与XMPP的连接通过身份验证时,将设置3个Stanza侦听器。一个用于呈现,一个用于消息和一个用于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的角度来看,android客户端从未断开连接(
  4. 当客户端连接到XMPP时,Smack Cache Ex线程数至少会增加100

当您应该使用同步节侦听器时,您可能会使用异步节侦听器。

最终,您应该能够跟踪创建所有这些线程的确切侦听器(假设实际上是由StanzaListener引起的,但即使现在还没有验证(。如果你确定了这是Smack设置的监听器,那么你可能应该在Smack社区论坛上报告这一问题。如果是您设置的侦听器,那么您可能希望使用同步侦听器或Smack的AsyncButOrdered实用程序来减少线程数量。

最新更新