Я построил tcp-сервер на основе apache mina 2.0.4, и у меня возникли проблемы с обратной записью клиенту.
У нас есть несколько tcp-клиентов, которые могут обрабатывать только одно сообщение за раз, и с максимальным размером буфера 256 байт. Когда я отправляю клиенту 2+ сообщения (‹256 байт), они приходят в виде одного или двух больших блоков, которые клиент не может обработать, вместо 2+ отдельных сообщений. Я безуспешно пытался установить sessionConfig.setTcpNoDelay(true/false);
, равно как и sessionConfig.setSendBufferSize( 256 );
.
В кодировщике ответа на сообщение я также попытался сбросить вывод:
int capacity = 256;
IoBuffer buffer = IoBuffer.allocate(capacity, false);
buffer.setAutoExpand(false);
buffer.setAutoShrink(true);
buffer.putShort(type);
buffer.putShort(length);
buffer.put(gmtpMsg.getMessage().getBytes());
buffer.flip();
out.write(buffer);
out.flush();
И в ветке, отвечающей за отправку сообщений, я пытался дождаться написания сообщения
for (Entry<Long, OutgoingMessage> outgoingMsg : outgoingMsgs.entrySet()) {
WriteFuture future = session.write(outgoingMsg.getValue());
future.awaitUninterruptibly();
}
Все это с треском проваливается, и единственное работающее решение - это нелепый сон на 500 мс между сессиями записи, что вряд ли приемлемо. Кто-нибудь видит, что я делаю неправильно?