Apache Mina - множественная небольшая запись клиенту

Я построил 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 мс между сессиями записи, что вряд ли приемлемо. Кто-нибудь видит, что я делаю неправильно?


person Michel    schedule 20.03.2012    source источник


Ответы (1)


Прочитав немного больше о протоколе tcp и особенно https://stackoverflow.com/a/6614586/1280034, он Понятно, что проблема на стороне клиента, а не на правильной обработке пакетов.

Поскольку мы не можем восстановить клиентов, мое единственное решение - задерживать каждое исходящее сообщение примерно на 500 мс. Для этого я создал дополнительную очередь, отвечающую за запись для клиентов, чтобы сервер мог продолжать свою обычную работу.

person Michel    schedule 21.03.2012