我在openfire服务器中启用了离线消息选项。但我无法离线消息
用户A在线,用户B在线,在这种情况下,我可以收到消息。
现在用户B关闭了他的WiFi(注意:用户A等到用户B会话在服务器中完全被杀)
现在用户A向用户B发送消息
在这种情况下,我能够在openfire离线表中看到该消息。
现在用户B再次上线服务器正在向用户B发送消息,因为服务器知道用户B在线 (消息从离线消息表中消失)。
但是用户B不会收到该消息。
connection.login(userName, userPwd, UiUtility.getMyPhoneNO());
PacketFilter filter = new PacketTypeFilter(org.jivesoftware.smack.packet.Message.class);
packetListener =new PacketListener() {
public void processPacket(Packet packet) {
Message message = (Message) packet;
if (message.getBody() != null) {
String fromName = StringUtils.parseBareAddress(message
.getFrom());
Log.i("XMPPClient", "Got text [" + message.getBody()
+ "] from [" + fromName + "]");
}
}
};
connection.addPacketListener(packetListener, filter);
成功登录后再次正常聊天。但我想知道为什么这些离线消息丢失了?我的PacketListener无法捕获这些离线消息。请帮帮我
答案 0 :(得分:0)
Asmack被贬低了。使用Smack。用Java编写的用于JVM和Android的开源XMPP客户端库。将以下行添加到gradle文件中:
compile 'org.igniterealtime.smack:smack-android:4.1.3'
compile 'org.igniterealtime.smack:smack-tcp:4.1.3'
compile 'org.igniterealtime.smack:smack-extensions:4.1.3'
答案 1 :(得分:0)
问题很容易解决。 在与XMPP服务器建立连接之前,只需使用ASmack库提供的ProviderManager类注册提供程序。
如果这无法解决您的问题,请访问您的本地服务器并搜索离线消息,并选择ALWAYS STORE选项将存储限制设置为1000 kb。默认为100 kb。 希望这有效。
答案 2 :(得分:0)
经过多次斗争,我已经解决了这个问题。在您的openfire管理页面中,转到“客户端设置”并将空闲时间从360秒(默认情况下)减少到1秒(可能是)。只有当您与Internet断开连接时,它才会检测到您处于脱机状态并将其余消息保留为OFFLINE。
@覆盖 public void onNetworkConnectionChanged(boolean isConnected){
if(isConnected){
new Thread() {
public void run() {
try {
XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder();
builder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
builder.setUsernameAndPassword("phone", "admin");
builder.setSendPresence(true);
builder.setServiceName(<Service name>);
builder.setHost(<Host name>);
builder.setResource("Test");
builder.setDebuggerEnabled(true);
Presence presence = new Presence(Presence.Type.available);
presence.setStatus("Available");
connection = new XMPPTCPConnection(builder.build());
connection.connect();
connection.login();
Presence presence123 = new Presence(Presence.Type.available);
presence123.setStatus("Available");
try {
connection.sendStanza(presence123);
} catch (SmackException.NotConnectedException e) {
e.printStackTrace();
}
StanzaFilter filter = new AndFilter(new StanzaTypeFilter(Message.class));
PacketListener myListener = new PacketListener()
{
public void processPacket(Stanza stanza)
{
retrieveMessage(stanza,userType);
}
};
connection.addPacketListener(myListener, filter);
try {
connection.sendStanza(presence);
} catch (SmackException.NotConnectedException e) {
e.printStackTrace();
}
} catch (SmackException | XMPPException | IOException e) {
e.printStackTrace();
}
//return connection.isConnected();
}
}.start();
以上工作正常,能够检索离线消息。方法“retrieveMessage(stanza,userType);”用于处理传入的消息并更新适配器。确保在重新连接时将Presence发送为“可用”。如果还有任何问题,请告诉我。