启用 IQProvider 时,Smack 无法识别 type="result" 节

Posted

技术标签:

【中文标题】启用 IQProvider 时,Smack 无法识别 type="result" 节【英文标题】:Smack doesn't recognize type="result" stanza when IQProvider is enabled 【发布时间】:2016-04-09 09:51:07 【问题描述】:

tl;dr

注册 IQProvider 时,我在 StanzaListener 中没有得到答案,我可能没有准确理解 IQProviders 的工作原理,但不知道从哪里开始。


我正在使用 Smack 发送和接收一些自定义 IQ。这是我用来发送自定义 IQ 的代码。

iq.setFrom(JidCreate.fullFrom(CLIENT_USER));
iq.setTo(JidCreate.fullFrom(SERVER_USER));
xmppConnection.sendIqWithResponseCallback(iq, new StanzaListener() 
    @Override
    public void processPacket(Stanza packet) throws SmackException.NotConnectedException, InterruptedException 
        handleReply((WedooIQ) packet);
    
, new ExceptionCallback()
    @Override
    public void processException(Exception exception) 
        exception.printStackTrace();
    
);

好的。我确定发送了正确的答案,因为调试模式向我展示了我想看到的内容。结果节由另一端的节点客户端提供,所以这个问题不关心。


这对我来说不起作用:我在StanzaListener() 中得到了答案,但当然,如果我不想这样做,我也无能为力我自己的所有解析。我被告知要实现一个 IQProvider 并注册它 - 所以我这样做了:

ProviderManager.addIQProvider(Xxx.ELEMENT_NAME, Yyy.NAMESPACE, new ZzzIQProvider());

但是当它被注册时,我不再得到答案,而是在那 5 秒后出现超时异常

System.err: org.jivesoftware.smack.SmackException$NoResponseException: No response received within reply timeout. Timeout was 5000ms (~5s). Waited for response using: IQReplyFilter ......

我认为IQProvider 会成功,这样我就可以从上面的StanzaListener 中获得更有用的对象。这是如何运作的?我已经阅读了smack homepage 上的相关文档,但我不明白如何接收 IQ,我只了解如何注册提供者,对我没有任何明显影响。


可能只是在这里遗漏了一些小东西,非常感谢任何帮助,因为我已经坐了几天了。

【问题讨论】:

你同时发送多个 IQ/stanza 吗?? 抱歉,一秒忘记回答我的问题 我遇到了同样的问题,我在我的 IQProvider 上发现了一个错误。 IQProvider 返回具有不同节 id 的 IQ,因此 StanzaListener 不会使用 StanzaFilter 捕获结果 IQ..... 【参考方案1】:

我的解析器出现错误,我没有读完所有标签。所以它会在没有任何通知的情况下默默地失败。确保您正确读取整个 XML,同时在上课前不要滥用解析器或解析器

如果不是这样,这是来自 cmets 中 @calvinfly 的另一个想法:

我面临同样的问题,我在我的 IQProvider 上发现了一个错误。 IQProvider 返回具有不同节 id 的 IQ,因此 StanzaListener 不会使用 StanzaFilter 捕获结果 IQ.....

【讨论】:

以上是关于启用 IQProvider 时,Smack 无法识别 type="result" 节的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Smack 中启用 XEP-0199?

asmak 数据包侦听器和自定义 IQProvider 未触发/调用

将 PrivateDataManager 与 (a)Smack 一起使用时,无法获取所有 BookMarkedRooms。总是只返回最后一个书签

ClassCastException: org.jivesoftware.smack.PacketReader$4 在传输文件时无法转换为 org.jivesoftware.smackx.packet

无法通过使用 smack、openfire 获得名册

SmackInitialization:无法确定 Smack 版本