启用 IQProvider 后,Smack 无法识别 type="result" 节
Smack doesn't recognize type="result" stanza when IQProvider is enabled
tl;dr
在注册 IQProvider 时,我在 StanzaListener
中没有得到答案,我可能没有准确理解 IQProvider 的工作原理,但不知道从哪里开始。
我正在使用 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,我只知道如何注册一个提供者,对我没有任何可见的影响。
可能只是遗漏了一些小东西,非常感谢任何帮助,因为我已经坐了好几天了。
我的解析器出错,我没有读完所有标签。所以它会在没有任何通知的情况下默默地失败。确保您正确阅读整个 XML,同时在 class
之前不要滥用解析器或解析器
如果不是这样,评论中@calvinfly 的另一个想法:
I am facing same problem, and I found a bug on my IQProvider.
IQProvider returns IQ with different stanza id, so StanzaListener wouldn't capture the result IQ with StanzaFilter.....
tl;dr
在注册 IQProvider 时,我在 StanzaListener
中没有得到答案,我可能没有准确理解 IQProvider 的工作原理,但不知道从哪里开始。
我正在使用 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,我只知道如何注册一个提供者,对我没有任何可见的影响。
可能只是遗漏了一些小东西,非常感谢任何帮助,因为我已经坐了好几天了。
我的解析器出错,我没有读完所有标签。所以它会在没有任何通知的情况下默默地失败。确保您正确阅读整个 XML,同时在 class
之前不要滥用解析器或解析器如果不是这样,评论中@calvinfly 的另一个想法:
I am facing same problem, and I found a bug on my IQProvider. IQProvider returns IQ with different stanza id, so StanzaListener wouldn't capture the result IQ with StanzaFilter.....