порядок выполнения потока гарантирован - PullRequest
1 голос
/ 28 марта 2011

У меня есть код, вызываемый из сервлета, который вызывает внешнюю службу.Конечно, нет никаких гарантий, сколько времени потребуется сервису, чтобы вернуть ответ.Мне нужно убедиться, что одновременно выполняется не более одного вызова этой службы, но, конечно, контейнер сервлета может выполнять параллельные запросы к сервлету.Я хочу гарантировать, что приоритет запросов обрабатывается одним файлом, в порядке очереди.Поэтому недостаточно синхронизировать мой вызов с внешним сервлетом, потому что, как только текущий вызов завершится, не будет никакой гарантии относительно того, какой поток подключится к следующему вызову.

Есть идеи?

Ответы [ 4 ]

5 голосов
/ 28 марта 2011

Вы можете использовать надежный замок

Lock lock = new ReentrantLock(true);

Это дает блокировку в том порядке, в котором она была предпринята.

4 голосов
/ 28 марта 2011

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

1 голос
/ 28 марта 2011

Многие утилиты в java.util.concurrent подходят для этой ситуации, Semaphore с настройкой честности - еще один выбор

import java.util.concurrent.*;
Semaphore sem = new Semaphore (int n = HOW_MANY_PERMITS, boolean fairness = true);
0 голосов
/ 28 марта 2011

Создайте рабочий поток в вашем сервлете и добавьте туда выноски. Обработка запросов будет синхронизироваться при добавлении запроса в очередь, а затем просто сидеть и ждать, пока рабочий поток отправит отчет.

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