Azure/qpid-proton-j-extensions maxframesize ограничивает размер сообщений до 4 КБ

#java #azure #service #bus

#java #azure #Обслуживание #Автобус

Вопрос:

Azure / qpid-proton-j-extensions WebSocketHandlerImpl выдает исключение, если буфер dsetination меньше, чем поток сообщений, который, по-видимому, жестко запрограммирован на 4 КБ плюс некоторая информация о заголовке … из того, что я прочитал, служебная шина Azure разрешает сообщения объемом до 256 КБ, 1 МБ для premium, плюс заголовок 64 КБ

можем ли мы в любом случае увеличить это до 256 КБ?

 WebSocketHandlerImpl:
 dstBuffer.clear();
            if (dstBuffer.capacity() >= webSocketFrame.size()) {
                dstBuffer.put(webSocketFrame.toByteArray());
            } else {
                throw new OutOfMemoryError("insufficient output buffer size");
            }
        } else {

WebSocketImpl:
  private int maxFrameSize = (4 * 1024)   (16 * WebSocketHeader.MED_HEADER_LENGTH_MASKED);
  

Ответ №1:

Согласно исходному коду, WebSocketHandlerImpl.java#L90 как показано ниже, я думаю, что у вас ошибка в понимании кода dstBuffer.capacity() >= webSocketFrame.size() с переменной webSocketFrame .

 // Auto growing buffer for the WS frame, initialized to minimum size
ByteArrayOutputStream webSocketFrame = new ByteArrayOutputStream(WebSocketHeader.MIN_HEADER_LENGTH_MASKED   dataLength);
  

webSocketFrame Переменная не была жестко запрограммирована с фиксированным размером, который является ByteArrayOutputStream объектом с автоматически увеличивающимся буфером. Однако dstBuffer переменная является ByteBuffer объектом с фиксированным размером полезной нагрузки и заголовком websocket, пожалуйста, обратитесь к тестовому коду WebSocketHandlerImplTest.java , например, ниже.

 // public void testWrapBuffer_short_payload() {
// L296
int payloadLength = 100;
int messageLength = payloadLength   WebSocketHeader.MIN_HEADER_LENGTH_MASKED;

// L305
ByteBuffer srcBuffer = ByteBuffer.allocate(payloadLength);
ByteBuffer dstBuffer = ByteBuffer.allocate(messageLength);

// And others functions testWrapBuffer_xxxx_payload
  

Комментарии:

1. Привет, Питер, итак, webSocketFrame в порядке, по сути, там, где находится сообщение, но ByteBuffer инициализируется в конструкторе WebSocketImpl как outputBuffer = newWriteableBuffer(maxFrameSize);

2. Хм, я думаю, вы правы, я ищу не в том месте, кажется, WebsocketConnectionHandler в azure-servicebus 2.0.0 также распознает ограничение?? public int getMaxFrameSize() { // Это текущее ограничение github.com/Azure/qpid-proton-j-extensions //однажды эта библиотека позволяет использовать большие фреймы — это свойство можно удалить. возвращает AmqpConstants. WEBSOCKET_MAX_FRAME_SIZE; }