#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; }