2016-01-05 9 views
0

Мы используем Spring Boot версии 1.2.8.RELEASE, которая имеет управляемую зависимость от org.projectoreactor.* с реакторной версией 1.1.6.RELEASE.Project Reactor с Netty TCP Server - ByteBuff Размер застрял в 1024 при декодировании сообщений

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

Вопрос 1. Как увеличить 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(); 
    } 
} 

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

Примечание: В моем «основном» методе для настройки среды используется следующее. Netty Server работает под Windows и клиент находится в Linux. Связано ли это с реализацией Windows TCP?

// 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(); 

ответ

0

Хорошо, после отладки кода, и я понял, что проблема - Кстати, это не находится в какой-либо документации, которую я нашел на проекте реактора (Облапать КРТ).

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

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