当前位置: 首页 > 知识库问答 >
问题:

没有得到离线消息与smack

漆雕原
2023-03-14

我正在尝试一个带有openfire、smack和android的聊天应用程序,其中脱机消息不起作用。如果两个用户都在线,则能够正确发送和接收消息。但是,如果用户A处于脱机状态,并且用户B发送了一条消息,那么一旦用户A处于联机状态,他就不会收到B发送的消息。尝试了stackoverflow中可能的解决方案,但均无效。使用以下代码检索脱机消息。

新线程(){公共无效运行(){

            XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()

                    .setSocketFactory(SocketFactory.getDefault())

                    .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)

                    .setServiceName("123.456.0.854")//service name

                    .setHost("123.456.0.854") // host name 

                    .setPort(5222) //port

                    .setUsernameAndPassword("phone", "admin")
                    .setConnectTimeout(40000)

                    .setCompressionEnabled(false).build();

            connection = new XMPPTCPConnection(config);

            try {
                connection.connect();
                connection.login("phone", "admin");
                Presence presence = new Presence(Presence.Type.available);
                presence.setStatus("Available");
                try {
                    connection.sendStanza(presence);
                } catch (SmackException.NotConnectedException e) {
                    e.printStackTrace();
                }
            } catch (SmackException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (XMPPException e) {
                e.printStackTrace();
            }



            OfflineMessageManager offlineMessageManager = new OfflineMessageManager(connection);

            try {
                System.out.println("Count is " +offlineMessageManager.getMessageCount());
            } catch (SmackException.NoResponseException e) {
                e.printStackTrace();
            } catch (XMPPException.XMPPErrorException e) {
                e.printStackTrace();
            } catch (SmackException.NotConnectedException e) {
                e.printStackTrace();
            }

        }
    }.start(); 

共有1个答案

诸葛彦
2023-03-14

经过多次努力,我终于解决了这个问题。在openfire管理页面中,转到“客户端设置”,并将空闲时间从360秒(默认)减少到1秒(可能是)。只有当你们断开和Internet的连接时,它才能检测到你们处于脱机状态,并将其余的邮件保留为脱机状态。

@重写公共void onNetworkConnectionChanged(布尔值未连接){

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(节,用户类型);”用于处理传入消息并更新适配器。重新连接时,请确保将状态信息发送为“可用”。如果还有任何问题,请告诉我。

 类似资料:
  • 我使用的是spring boot 2.2.4版本,spring-kafka 2.4.2版本 我的场景是以下一个: 所以我写了folloqing代码 生产者微服务 spring kafka配置: 在制作人方面所有的工作都很好。我能创造话题和发送信息。 消费者微服务 动态侦听器类 当我在生产者端发送消息时,我可以看到以下日志: 在消费者方面,我没有看到任何信息。我只看到下面的指纹: 谁能告诉我我错在哪

  • 我刚刚注意到,当我在分区中生成单个消息时,我的使用者不会收到它。只有在我在同一分区中生成了更多的消息之后,使用者才会收到它们。我的数设置为 1。 是否有其他一些配置可能会影响这里? 每个分区都有一个专用的消费者。 相关部件的使用者代码。我的使用者为 定义的不同主题启动多个线程。使用 https://github.com/mmustala/rdkafka-ruby 这是原始消费宝石的叉子。我添加了一

  • 我的应用程序成功发送Kafka消息,但只有在Kafka初始化后。在此之前,我得到错误“Dispatcher没有订阅者”。如何等待订阅者完成频道注册? 17.165 SenderClass已创建 17.816初始化类,@PostConstruct启动PollingTask 24.781PollingTask发送第一条Kafka消息 24.816第一个错误:“Dispatcher没有订阅服务器” 25

  • 我在mac上运行Kafka和Flink作为docker容器。 我已经实现了Flink作业,它应该消耗来自Kafka主题的消息。我运行一个向主题发送消息的python生产者。 工作开始时没有问题,但没有收到任何消息。我相信这些消息被发送到了正确的主题,因为我有一个能够使用消息的python消费者。 flink作业(java): Flink作业日志: 生产者作业(python):(在主机上运行-不是d

  • 我目前分析了我的kafka制作人Spring boot应用程序,发现许多“kafka制作人-网络-线程”正在运行(总共47个)。即使没有发送数据,它也永远不会停止运行。我的应用程序看起来有点像这样: 与KafkaSender: 因为每次我想给kafka发送消息时,我都会引用一个新的KafkaSender,所以我认为会创建一个新的线程,然后将消息发送到Kafka队列。目前看起来像是产生了一批生产者,

  • 我正在尝试把阿帕奇Storm和Kafka整合在一起。连接似乎建立良好,但没有收到任何消息。但是这些消息似乎也被发送到了Kafka服务器,而Kafka服务器中相应主题的索引文件显示存在一些数据。有没有一种方法可以在Storm End上调试这个更多的..?我正在使用Storm的客户解码器来处理信息。Storm的实现是: