2016-11-28 18 views
11

Tôi đã xây dựng một ứng dụng trò chuyện bằng cách sử dụng máy chủ Openfire (xmpp). Trò chuyện trực tiếp với một người đang hoạt động tốt và tin nhắn được gửi ngay lập tức. Nhưng khi chúng tôi gửi một tin nhắn trong một nhóm, tin nhắn đầu tiên bị trì hoãn và tin nhắn thứ hai được gửi ngay lập tức.Nhắn tin nhóm bị trì hoãn trong openfire

MultiUserChatManager groupChat = 
      MultiUserChatManager.getInstanceFor(connection).getMultiUserChat("group_name"); 
groupChat.send("Message object"); 

Tại sao thư đầu tiên bị trì hoãn?

MUC Creation là

MultiUserChatManager mchatManager = MultiUserChatManager.getInstanceFor(xmpptcpConnection); 
     MultiUserChat mchat = mchatManager.getMultiUserChat(group); 
     if (!mchat.isJoined()) { 
     Log.d("CONNECT", "Joining room !! " + group + " and username " + username); 
     boolean createNow = false; 
     try { 
      mchat.createOrJoin(username); 
      createNow = true; 
     } catch (Exception e) { 
      Log.d("CONNECT", "Error while creating the room " + group + e.getMessage()); 
     } 

     if (createNow) { 

      Form form = mchat.getConfigurationForm(); 
      Form submitForm = form.createAnswerForm(); 

      List<FormField> formFieldList = submitForm.getFields(); 
      for (FormField formField : formFieldList) { 
      if(!FormField.Type.hidden.equals(formField.getType()) && formField.getVariable() != null) { 
       submitForm.setDefaultAnswer(formField.getVariable()); 
      } 
      } 

      submitForm.setAnswer("muc#roomconfig_persistentroom", true); 
      submitForm.setAnswer("muc#roomconfig_publicroom", true); 

      mchat.sendConfigurationForm(submitForm); 

      //mchat.sendConfigurationForm(
      // new Form(DataForm.Type.submit)); //this is to create the room immediately after join. 
     } 
     } 
     Log.d("CONNECT", "Room created!!"); 
     return true; 
    } catch (SmackException e) { 
     e.printStackTrace(); 
    } catch (XMPPException.XMPPErrorException e) { 
     e.printStackTrace(); 
    } 
+0

Có thể bạn lưu trữ thư đến trong cơ sở dữ liệu? Nếu có, tôi đoán đó là một vấn đề khác bằng cách tạo cơ sở dữ liệu hơn là một thông báo bị trì hoãn ... – Opiatefuchs

+0

Chỉ xuất hiện thông điệp đầu tiên của nó. Sau khi chúng tôi chuyển đổi nhóm thì điều tương tự xảy ra trong thông báo đầu tiên. –

+0

Nếu đó chỉ là vấn đề cơ sở dữ liệu thì hãy lặp lại những điều tương tự –

Trả lời

3

Có một vấn đề về sự sáng tạo và một loại tác dụng phụ truyền vào gửi. Tôi nghĩ đơn giản là bạn cần tham gia cuộc trò chuyện lần đầu tiên kể từ khi bạn không làm trước và thông báo đầu tiên cũng kích hoạt Groupchat trên máy chủ, vì vậy thông báo đầu tiên bị trì hoãn vì bạn không hoàn tất quá trình tạo nhiều tài khoản.

Cách khắc phục.

Trong giai đoạn sáng tạo, phần này phải được cải thiện:

if (!mchat.isJoined()) { 
     Log.d("CONNECT", "Joining room !! " + group + " and username " + username); 
     boolean createNow = false; 
     try { 
      mchat.createOrJoin(username); 
      createNow = true; 
     } catch (Exception e) { 
      Log.d("CONNECT", "Error while creating the room " + group + e.getMessage()); 
     } 

Với chỉ:

boolean createNow 
try 
{ 
    if (!mchat.isJoined()) 
    { 
     createNow = mchat.createOrJoin(username); 
    } 
} 
catch (Exception e) 
{ 
    throw new Exception("ERROR!"); 
} 

và sau invokation này:

mchat.sendConfigurationForm(submitForm); 

add:

if (!mchat.isJoined()) { 
    mchat.join(username); 
} 

creationOrJoin phương pháp về việc tạo HOẶC tham gia (như tên cho biết): để kích hoạt trò chuyện, bạn phải tham gia sau giai đoạn tạo.

Tuy nhiên createOrJoin có lẽ một hành vi bất ngờ do một tấm séc đúp về phòng đã tham gia để giữ Syncro giữa phiên trong ứng dụng và phiên trên máy chủ, do đó mchat.join()phải được gọi sau khi. Tên rõ ràng có thể nghe như: mustCreateBeforeOrCanJoinDirectly()

+0

Xin lỗi bạn bè nhưng nó không hoạt động .. –

+0

nó có thể trì hoãn phía máy chủ ???? –

+0

khởi động lại Openfire nếu bạn có thể và thử trò chuyện mới. Nếu không hoạt động trở lại, chúng tôi có thể kiểm tra điều gì đó khác (tuy nhiên tôi khuyên bạn nên sử dụng đoạn mã của mình). Tôi không có vấn đề gì về tin nhắn đầu tiên ... – MrPk

Các vấn đề liên quan