websocket Session#setMaxTextMessageBufferSize慢吗,我可以动态设置吗?

时间:2019-05-04 17:09:17

标签: java tomcat websocket

我有一堆(约6个...例如 B1-B6 ),这些tomcat容器通过websockets连接到一个说有 C 的tomcat容器,该容器托管一个控件面板应用程序。

他们定期通过websocket发送更新到 C ,并且 C 也通过websocket发送命令给他们。

我在session.setMaxTextMessageBufferSizeServerEndPoint类的onOpen方法中将ClientEndPoint设置为10KB。

消息传递工作正常,但有时会生成一些数据,这些数据的大小超过会话的最大TextMessage BufferSize。

我有个主意要做类似的事情:

 public boolean write(String message) {

        Worker w = this;//This is the Worker class, so i can do `this`

        while (!w.getSessions().isEmpty()) {
            //Ask for a session
            Session session = w.getSessions().poll();

            if (session != null) {
                //Session granted
                synchronized (session) {
                    int defaultBufferSize = session.getMaxTextMessageBufferSize();
                    int bytesToTransmit = message.getBytes().length;
                    if (defaultBufferSize <= bytesToTransmit) {
                        //increase the maximum buffer size to accomodate large messages
                        session.setMaxTextMessageBufferSize(bytesToTransmit + 16);
                    }

                    try {
                        //send your message in peace?
                        session.getBasicRemote().sendText(message);
                        //return connection to the pool.
                        w.getSessions().offer(session);
                               //Reset to the default buffer size to ..maybe reclaim memory?
                        session.setMaxTextMessageBufferSize(defaultBufferSize);
                        return true;
                    } catch (IOException ex) {
                        ex.printStackTrace(); 
                    }
                }
            }

        }

        return false;
    }

也就是说,将要传输的文本的字节大小与会话的最大缓冲区大小进行比较,如果会话无法容纳该字节,则增加会话的缓冲区大小。

但是我深深地怀疑,由于某些奇怪的原因,这可能行不通。

  1. 这还行吗?
  2. 在生产中这可能出什么问题?
  3. 说得通,设置最大缓冲区大小的过程是昂贵的吗?

    我曾经观察到Tomcat根据我之前在连接池上设置的最大缓冲区大小分配内存。因此,我假设正在进行一些内存分配(和释放)。

是这样吗?

谢谢。

请注意

我了解部分消息,并在OnMessage批注上限制了允许的传入消息大小。我不想使用任何一种方法。

0 个答案:

没有答案