Java Websocket上网后如何发送离线用户的消息?

我正在尝试使用webcocket编写聊天,对于脱机用户,我使用了Java Queue,如果用户脱机,则将消息保存在队列中,当用户上线时,我检查Queue是否为空,如果不是,则使用循环删除队列中的每个消息.问题是即使所有消息都在队列中,它也只会向用户发送最后一条消息,
这是我的onOpen方法:

@ServerEndpoint(value = "/chat/{room}/{user}", encoders = ChatMessageEncoder.class, decoders = ChatMessageDecoder.class)
 public class ChatEndpoint {


private final Logger log = Logger.getLogger(getClass().getName());
private static final Map<String, Queue<ChatMessage>> userMessageBuffer = new HashMap<>();

@OnOpen
public void open(final Session session,
        @PathParam("room") final String room,
        @PathParam("user") final String userId) {

    log.info("session openend and bound to room: " + room);
    // session.getUserProperties().put("room", room);
    session.getUserProperties().put("user", userId);

    Queue<ChatMessage> userMsgs = userMessageBuffer.get(userId);
    ChatMessage sendChat = new ChatMessage();

    if (userMsgs != null && !userMsgs.isEmpty()) {

        for (int i = 0; i < userMsgs.size(); i++) {

            sendChat = userMsgs.remove();
            System.out.println("size!!!!!! " + sendChat.getMessage());
            try {

                    session.getBasicRemote().sendObject(sendChat);

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (EncodeException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }

}}

有谁知道问题出在哪里吗?

最佳答案
我没有检查完整的代码,但可以肯定

      for (int i = 0; i < userMsgs.size(); i++)

是你的问题.因为您使用的是i,并且将userMsgs.size()作为for循环中的条件进行检查.因此,将i增大1并将userMsgs大小减小1,实际上,您将只能访问队列中一半的元素.

假设您最初有8个元素(想象一下,就像海军上将Aladeen解释圆形导弹一样)

               i=0 and userMsgs.size()=8
               i=1 and userMsgs.size()=7
               i=2 and userMsgs.size()=6
               i=3 and userMsgs.size()=5
               i=4 and userMsgs.size()=4 // comes out of loop.

您应该改用while循环,

  while(!userMsgs.isEmpty()){
   .....
  }

您说您只能向用户发送最后一条消息,可能是因为队列中只有2条消息.我知道这种情况很少见,但根据您的代码应该是这种情况.

转载注明原文:Java Websocket上网后如何发送离线用户的消息? - 代码日志