У меня есть веб-приложение, которому иногда нужно загрузить несколько байтов из URL-адреса, упаковать его и отправить обратно запрашивающей стороне.Загруженные байты сохраняются в течение некоторого времени, поэтому их можно использовать повторно, если для загрузки требуется тот же URL-адрес.Я пытаюсь выяснить, как лучше всего не допустить, чтобы потоки загружали один и тот же URL-адрес одновременно, если запросы приходят одновременно.Я думал о создании класса, подобного приведенному ниже, который предотвратил бы одновременную загрузку одного и того же URL.Если URL-адрес не может быть заблокирован, он либо ждет, пока его не заблокируют, чтобы попытаться загрузить его, если он не существует после разблокировки.
public class URLDownloader
{
HashMap<String,String> activeThreads = new HashMap<String,String>();
public synchronized void lockURL(String url, String threadID) throws UnableToLockURLException
{
if(!activeThreads.containsKey(url))
activeThreads.put(url, threadID)
else
throw UnableToLockURLException()
}
public synchonized void unlockURL(String url, String threadID)
{
//need to check to make sure its locked and by the passed in thread
returns activeThreads.remove(url);
}
public synchonized void isURLStillLocked(String url)
{
returns activeThreads.contains(url);
}
}
У кого-нибудь есть лучшее решение для этого?Мое решение кажется верным?Существуют ли какие-либо компоненты с открытым исходным кодом, которые уже делают это очень хорошо, что я могу использовать?
Спасибо