Мне нужно реализовать приложение, которое одновременно обменивается данными с несколькими клиентами, используя (двунаправленный) протокол запроса-ответа. Ранее я реализовал это, используя два выделенных потока для каждого клиента (один читатель / реактор и один писатель / инициатор). Проблема в том, что управление потоками стало довольно сложным и безобразным. Существует ли какой-либо стандартный способ обработки этого, возможно, даже с одним потоком или, по крайней мере, с постоянным количеством потоков для обработки всех клиентов?
Это то, как некоторые коммуникации будут выглядеть в потоке с реализацией блокировки:
Command response = request("cmd1", "a", "b");
if(!response.is("OK")) {
return;
}
response = request("cmd2", "c");
if(!response.is("OK")) {
return;
}
response = request("cmd3");
Между отправкой запроса и ожиданием соответствующего ответа я хотел бы, чтобы текущий поток мог выполнять другую работу, но затем продолжить выполнение, как только ответ действительно придет.
Я знаю, что можно было бы использовать асинхронный ввод-вывод и зарегистрировать экземпляры Java Future / Runnable для запуска после получения ответа на запрос, но это легко превращается в многоуровневое вложение анонимных подклассов Runnable, и я подозреваю, что это будет больше боли, чем стоит. Это может привести к чему-то похожему на приведенный ниже пример, который быстро становится сильно вложенным и нечитаемым. Неужели должен быть более простой способ?
request("cmd1", "a", "b", new ResponseHandler() {
public void response(Command response) {
if(response.is("OK")) {
request("cmd2", "c", new ResponseHandler() {
public void response(Command response) {
if(response.is("OK")) {
request("cmd3", new NullResponseHandler());
}
}});
}
}});
Я также рассмотрел возможность использования выделенной Actor Framework для обработки логики запрос-ответ. Хотя они выглядят так, как будто они могут помочь в этой ситуации, я никогда раньше не работал с такими платформами, поэтому я не знаю, подходят ли они для этой ситуации.
Короче говоря, мой вопрос: как я могу обрабатывать произвольное количество соединений запрос-ответ неблокирующим образом, чтобы было достаточно постоянного количества потоков? Являются ли рамки Actor правильным подходом?
PS. Я использую Java для этого проекта.