Grails один вызов метода за раз - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу не подчиняться процессу метода контроллера больше чем один запрос за один раз.Есть ли хороший способ реализовать это?

Проблема появляется, когда я вызываю методы с помощью запросов ajax post / get.Я объявил тайм-аут для AJAX.По таймауту js повторно отправляет запрос ajax.Иногда сервер не готов ответить на заданное время ожидания.Поэтому во время обработки один сервер запросов ajax начинает обрабатывать другой запрос ajax, и у меня возникают проблемы.

Я знаю, что могу исправить это на стороне клиента с помощью $ .when (). Done () или с помощью функций успеха ajax,но я понятия не имею, как это исправить на стороне сервера.Есть идеи?

1 Ответ

0 голосов
/ 12 декабря 2018

Если вам нужно убедиться, что определенный блок кода выполняется только один раз за раз (будь то действие контроллера или что-то еще), вы можете использовать ключевое слово synchronized в java.Вы можете добавить синхронизацию на уровне метода, добавив это к сигнатуре метода, хотя я не знаю, насколько хорошо это работает с действием контроллера (я никогда не пробовал).Вы также можете добавить синхронизированный блок, обернув код следующим образом:

// inside your controller action
synchronized {
    // will only execute once concurrently within your JVM
}

Или вы можете синхронизировать некоторый объект, чтобы ваша синхронизация могла основываться на некотором параметре:

// inside your controller action
synchronized ("${params.something}-whatever".intern()) {
    // will only execute one concurrently per unique 'key'
}

ТамСтоит ли изучать нюансы (например, что произойдет, если вы вызовете этот метод изнутри самого себя: он будет работать, и последствия для памяти интернирующих строк против использования некоторых других ключевых объектов для синхронизации), но это общий шаблон, который должен позволить вам контролироватьодновременное выполнение потенциально поточно-небезопасного кода.

Учитывая все вышесказанное, будьте осторожны при реализации такого шаблона.Довольно легко получить плохую производительность или даже тупики, когда зачастую основная проблема заключается в коде на стороне клиента и необходимости лучше обрабатывать дублированные или прерванные запросы!

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