1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/apexes-wsonrpc

 / Детали:

В некоторых случаях ByteBuffer типа DirectByteBuffer не может вызвать метод array()

Завершенные
Владелец
Создано  
26.11.2024

net.apexes.wsonrpc.server.WsonrpcServerBase#onMessage

public void onMessage(String sessionId, ByteBuffer buffer) {
    try {
        WebSocketSession session = WsonrpcRemotes.getSession(sessionId);
        byte[] bytes = buffer.array(); // В некоторых случаях buffer типа DirectByteBuffer, не имеет метода array, вызов завершается неудачно
        fireMessage(sessionId, bytes);
        wsonrpcEngine.handle(session, bytes);
    } catch (Exception ex) {
        onError(sessionId, ex);
    }
}

ByteBuffer обычно типа HeapByteBuffer и может быть успешно преобразован в byte[].
При интеграции Spring Websocket столкнулся с тем, что ByteBuffer является типом DirectByteBuffer и не может быть напрямую преобразован.
Конкретная причина неизвестна, я запускал несколько разных проектов, иногда это HeapByteBuffer, а иногда DirectByteBuffer. Возможно, связано с распределением памяти.

После изменения

public void onMessage(String sessionId, ByteBuffer buffer) {
    try {
        WebSocketSession session = WsonrpcRemotes.getSession(sessionId);
        byte[] bytes = getBytes(buffer);
        fireMessage(sessionId, bytes);
        wsonrpcEngine.handle(session, bytes);
    } catch (Exception ex) {
        onError(sessionId, ex);
    }
}

private byte[] getBytes(ByteBuffer buffer) {
    if (buffer.hasArray()) {
        // HeapByteBuffer
        return buffer.array();
    }

    // DirectByteBuffer
    byte[] bytes = new byte[buffer.remaining()];
    buffer.get(bytes);
    return bytes;
}

Описание изображения

Описание изображения

Комментарий (0)

GitLife Service Account Задача создана
GitLife Service Account добавлено
 
bug
label.
GitLife Service Account изменить Статус задачи с Предстоит сделать на Завершенные
Развернуть журнал операций

Вход Перед тем как оставить комментарий

Статус
Ответственный
Контрольная точка
Pull Requests
Связанные запросы на слияние могут быть закрыты после их объединения
Ветки
Дата начала   -   Крайний срок
-
Закрепить/Открепить
Приоритет
Участники(1)
1
https://api.gitlife.ru/oschina-mirror/apexes-wsonrpc.git
git@api.gitlife.ru:oschina-mirror/apexes-wsonrpc.git
oschina-mirror
apexes-wsonrpc
apexes-wsonrpc