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.