2016-11-14 3 views
0

У меня естьIs getRemote(). SendString (msg, new WriteCallback() {..}) стабильно?

class MyWebSocket extends WebSocketAdapter 

Мне нужно отправить TEXT1, text2 и Text3 к WebSocket клиента с помощью:

getRemote().sendString(text, new WriteCallback() {...}) 

Этот вызов асинхронной, поэтому я ожидаю, что работа выполняется в разных потоках из пула Jetty в ,

Мой вопрос:

Могу ли я быть уверен, что на клиенте последовательность будет такой же: text1, text2 и text3?

Если да, добавьте ссылку на официальную документацию, если таковая имеется.


Обновление: В документации RemoteEndpoint можно прочитать:

void sendString(String text) 
     throws IOException 

Отправить текстовое сообщение, блокирование, пока все байты сообщения не было передано.

и

void sendString(String text, 
       WriteCallback callback) 

Запускает асинхронную передачу текстового сообщения. Этот метод может вернуться до передачи сообщения. Разработчики могут предоставить ответный вызов , чтобы получать уведомление, когда сообщение было передано, или привели к ошибке.

Итак, в случае sendString с обратным вызовом, как он может быть асинхронным, если вызываемый вызов вызывается в том же потоке?

Кроме того, в чем разница между этими двумя методами?

+0

Я не вижу замечания для асинхронного метода, в котором обратный вызов вызывается (синхронно) из того же потока. Я бы оценил, что он вызван из другого потока, который обрабатывает исходящие кадры. – Matthias247

ответ

1

Этот вызов просто вызывает очередь исходящего текста для конечной точки WebSocket.

Затем, когда уровни NIO сообщают о возможности записи, сообщение в очереди преобразуется в кадры, передается через расширения WebSocket, маскируется (если отправляется от клиента), а затем записывается в сокет.

Как только весь буфер для этого кадра записывается в сокет, запускается WriteCallback.

Ничего из этого в настоящее время нет.

Существует только 1 обработка потоков, и она обрабатывает сообщения только из очереди.

+0

Спасибо! Правильно ли: мой поток заблокирован до тех пор, пока «слои NIO не сообщают, что запись возможна»? – Vitaly

+0

Прочитана отдельная обработка потока и уведомление вашей конечной точки. Блокированный поток не из записи/NIO, а, скорее, в очередь.Его не бесконечно, и через некоторое время (из-за давления памяти) блокировки блокируются. –