Apache Mina выполняет асинхронный обмен сообщениями поверх различных транспортов, включая TCP.
Поскольку Mina является асинхронной, следует ожидать доставки вне очереди.
Почему я получаю данные о заказе (это редко, но случается время от времени)?
Одним из возможных объяснений является использование нескольких потоков TCP. Данные, доставленные с использованием одного потока TCP, будут доставляться по порядку, но если используется несколько потоков, данные в одном потоке могут «обогнать» данные в другом потоке, в стеках TCP на передающей или принимающей стороне, в сети или в клиентская библиотека.
Как может машина, использующая протокол TCP, просто запустить и забыть о данных, не убедившись, что приемное устройство подключено к нему перед отправкой данных?
Потому что ... надежная доставка не является основным атрибутом Мины.
Если вы используете Mina для связи со службой с конкретным протоколом приложения, то этот протокол определит, будет ли разрешена / будет работать «отправка данных до проверки подключения получателя» или нет. Например, это не относится к ответу HTTP, поскольку ответ HTTP отправляется на соединение, которое было ранее установлено для отправки запроса.
На самом деле, кажется, что есть множество способов использовать Мину. Некоторые включают протокол приложения; например см HttpClientCodec
и HttpServerCodec
. Другие нет.
Это действительно TCP или UDP или какой-то вариант протокола TCP?
Если они говорят, что TCP используется в качестве транспорта, то это так. Однако Мина не является ни TCP, ни UDP. Это Мина. Это скрывает детали транспорта.
Итог: если вам нужны свойства надежности / порядка доставки TCP / IP, вам, вероятно, следует использовать их напрямую. Mina обеспечивает более высокую производительность, чем обычный TCP / IP, через синхронный сокет, ослабляя нормальные свойства (одного) потокового транспорта.