Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java websocket中在线后发送离线用户的消息?_Java_Websocket_Java Websocket - Fatal编程技术网

如何在java websocket中在线后发送离线用户的消息?

如何在java websocket中在线后发送离线用户的消息?,java,websocket,java-websocket,Java,Websocket,Java Websocket,我正在尝试使用WebSocket编写聊天,对于脱机用户,我使用java队列,如果用户脱机,我会将消息保留在队列中,当用户联机时,我会检查队列是否为空,如果不是,则使用循环从队列中删除每条消息。问题是,即使所有消息都在队列中,它也只向用户发送最后一条消息, 以下是我的onOpen方法: @ServerEndpoint(value = "/chat/{room}/{user}", encoders = ChatMessageEncoder.class, decoders = ChatMessageD

我正在尝试使用WebSocket编写聊天,对于脱机用户,我使用java队列,如果用户脱机,我会将消息保留在队列中,当用户联机时,我会检查队列是否为空,如果不是,则使用循环从队列中删除每条消息。问题是,即使所有消息都在队列中,它也只向用户发送最后一条消息, 以下是我的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();
            }

        }
    }

}}
@ServerEndpoint(value=“/chat/{room}/{user}”,encoders=ChatMessageEncoder.class,decoders=ChatMessageDecoder.class)
公共类聊天端点{
私有最终记录器log=Logger.getLogger(getClass().getName());
私有静态最终映射userMessageBuffer=newhashmap();
@奥诺彭
公开作废公开赛(最后一场),
@PathParam(“房间”)最终字符串房间,
@PathParam(“用户”)最终字符串(用户ID){
log.info(“会话打开并绑定到房间:“+房间”);
//session.getUserProperties().put(“room”,room);
session.getUserProperties().put(“用户”,userId);
Queue userMsgs=userMessageBuffer.get(userId);
ChatMessage sendChat=新建ChatMessage();
if(userMsgs!=null&&!userMsgs.isEmpty()){
对于(int i=0;i

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

我没有检查完整的代码,但肯定没有

      for (int i = 0; i < userMsgs.size(); i++)
您应该使用while循环

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

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

您确实意识到,
userMsgs.size()
每次for循环都会返回越来越小的值?什么是您的message broker?是的,它每次都会变小什么是message broker?除非您特别需要
I
,否则,只需使用
while(userMsgs.size()>0)
循环,而不是
for
循环。
  while(!userMsgs.isEmpty()){
   .....
  }