Как реализовать блокировку запроса-ответа с использованием примитивов параллелизма Java? - PullRequest
3 голосов
/ 02 апреля 2010

Моя система состоит из класса «прокси», который получает пакеты «запроса», собирает их и отправляет их по сети на сервер, который демарширует их, обрабатывает и возвращает некоторый «ответный пакет».

Мой метод submit на стороне прокси должен блокироваться до получения ответа на запрос (пакеты имеют идентификаторы для целей идентификации и ссылок) или до истечения времени ожидания.

Если бы я создавал это в ранних версиях Java, я бы, вероятно, реализовал в моем прокси набор «идентификаторов ожидающих сообщений», где я отправлял сообщение и ожидал () соответствующего идентификатора (с таймаутом) , Когда ответ получен, поток обработки уведомляет () соответствующий идентификатор.

Есть ли лучший способ добиться этого с помощью существующего библиотечного класса, возможно, в java.util.concurrency?

Если я выбрал решение, описанное выше, как правильно бороться с потенциальным состоянием гонки, когда приходит ответ до вызова wait ()?

1 Ответ

8 голосов
/ 02 апреля 2010

Простой способ - вызвать вызываемый объект, который обращается к серверу и возвращает ответ.

 // does not block
 Future<Response> response = executorService.submit(makeCallable(request));

 // wait for the result (blocks)
 Response r = response.get();

Управление очередью запросов, назначение потоков запросам и уведомление кода клиента - все это скрыто служебными классами.

Уровень параллелизма контролируется службой исполнителя. Каждый сетевой вызов блокирует там один поток.

Для лучшего параллелизма можно также использовать java.nio (но поскольку вы обращаетесь к одному и тому же серверу для всех запросов, достаточно фиксированного числа одновременных соединений, может быть, даже одного). *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...