У меня есть ссылка, по которой пользователи могут щелкнуть ее, и она получает файл фотографий в формате zip. Если zip-файл не существует, он запускает поток для создания zip-файла и отображает пользователю сообщение о том, что фотографии в настоящее время обрабатываются.
Чего я пытаюсь избежать, так это того, что пользователь несколько раз щелкает ссылку и выделяет целую массу потоков, которые попытаются создать / обновить zip-файл. Обработка zip-файлов требует значительных системных ресурсов, поэтому я хочу разрешить приложению генерировать только один zip-файл за раз. Если кто-то занят компилированием, он ничего не должен делать и ставить запросы в очередь.
В настоящее время я обращаюсь с этим с помощью cflock вокруг потока:
<cflock name="createAlbumZip" type="exclusive" timeout="30" throwontimeout="no">
<cfthread action="run" albumId="#arguments.albumId#" name="#CreateUUID()#">
....
Я надеюсь, что здесь произойдет (кажется, что это работает, если я протестирую это), что он проверит, запущен ли в данный момент поток, использующий блокировку с именем 'createAlbumZip'. Если есть, он будет помещать запрос в очередь на 30 секунд, после чего он должен завершиться безо всякой ошибки. Если он не смог создать его в течение 30 секунд, это нормально.
Итак - похоже, это работает, но мой вопрос: это лучший способ справиться со сценарием, подобным этому? Является ли блокировка правильным подходом? Есть ли какие-либо недостатки, которые могут возникнуть из-за этого подхода, которого я не вижу?