Project Reactor с Netty TCP Server - размер байта в 1024 при декодировании сообщений

Мы используем версию Spring Boot 1.2.8.RELEASE которая имеет управляемую зависимость org.projectoreactor.* с версией Reactor 1.1.6.RELEASE,

Проблема, с которой я сталкиваюсь, находится внутри моего пользовательского кодека (reactor.io.encoding.Codec) данный буфер (reactor.io.Buffer) ограничен 1024 байтами, но мое сообщение превышает этот предел. Когда я пытаюсь декодировать сообщения, это не полное сообщение (только частичное), и мое декодирование завершается неудачно, так как оно ожидает полного сообщения.

Вопрос первый: как мне увеличить Buffer bytes (reactor.io.Buffer) так моя функция применения работает правильно? Простой пример ниже:

public class StringDecoder implements Function<Buffer, String> {

    // Buffer is limited to 1024 but the message the client sent
    // was 2k
    @Override
    public String apply(Buffer bytes) {
        return bytes.toString();
    }
}

Вопрос второй: как мне сделать функцию применения (выше) разделенной на части? Это означает, что когда буфер Netty достигает своего предела, моя функция apply может создать свой собственный буфер (и управлять буфером), и в конце концов я могу декодировать сообщение, а Reactory/Netty может передать его Потребителю.

Примечание. В моем "основном" методе для настройки среды используется следующее.NETty Server работает под Windows, а клиент работает под Linux. Это связано с реализацией TCP в Windows?

// NOTES: ServerSocketOptions sets the max buffer for send and receive to 
// something much larger than 1024. Verified with debugger
TcpServerSpec<String, String> spec = new TcpServerSpec<String, String>(NettyTcpServer.class);
spec.env(env);
spec.listen(port);
spec.dispatcher("sync");
spec.codec(new AgentCodec());
spec.consume(connectionHandler(handler));

TcpServer<String, String> tcp = spec.get();
tcp.start().await();

1 ответ

Решение

Хорошо, после отладки кода, и я выяснил, в чем проблема - кстати, это не найдено ни в одной документации, которую я нашел в проекте Reactor (tisk tisk).

Функция apply будет вызываться с большим количеством сообщений. Так что, если сообщение 2K, apply будет вызвано дважды. Первый раз с 1К, затем второй раз с 2К.

ПРИМЕЧАНИЕ. Если вы не изменили положение буфера, он добавится в буфер. Если вы продвинете позицию буфера, она будет удалена при повторном вызове apply.

Другие вопросы по тегам