Доступ по одному клиенту за раз - PullRequest
0 голосов
/ 25 февраля 2009

Мои требования следующие.

У меня есть веб-приложение, разработанное на Java.

У меня есть ссылка на html-странице. Когда первый клиент нажимает кнопку отправки на html-странице, запускается пакетный файл.

Между тем, когда другой клиент нажимает кнопку отправки, он должен получить сообщение о том, что страница занята.

Если первый клиент нажимает кнопку выпуска, то другие клиенты должны иметь возможность запустить пакетный файл.

Как я могу это сделать?

Ответы [ 5 ]

1 голос
/ 25 февраля 2009

Установите флажок при нажатии кнопки отправки и снимите его при нажатии кнопки отпускания.

В зависимости от вашей архитектуры, флаг может быть любым - от логической переменной в вашем коде, специальной записи в вашей базе данных до временного файла.

Когда нажата кнопка отправки, проверьте, установлен ли флаг. Если это так, верните сообщение об ошибке, указывающее, что страница занята.

В псевдокоде:

if (flagIsSet()) {
  showPageIsBusy();
} else {
  setFlag();
  startBatchFile();
}

Не забудьте снять флажок, когда закончится пакетный файл или нажата кнопка разблокировки и где-то в блоке finally.

Вы также должны убедиться, что только клиент, запустивший пакетный файл, может освободить его и снять флажок.

Как отметил Ави в комментариях, вы также должны помнить о синхронизации доступа к флагу.

0 голосов
/ 25 февраля 2009

Это Синглтон или, лучше, Application-Bean. Этот Бин должен отбрасывать вашу длительную фоновую задачу и предоставлять информацию о ней, например, если он запущен и, возможно, что-то вроде того, когда он начался, кто его запустил, и если вы смогли продвинуться, вы также можете отобразить индикатор выполнения.

Если вы скажете нам, какую платформу веб-приложений вы используете, я думаю, мы могли бы дать лучшие советы.

0 голосов
/ 25 февраля 2009

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

0 голосов
/ 25 февраля 2009

вы можете использовать поле в классе сервлета (в противном случае большое значение nono) для флага.

0 голосов
/ 25 февраля 2009

Псевдоалгоритм:

Измените пакетный файл для запуска сервлета до и после пакетных операций.

Перед запуском пакетного файла установите сервлет или флаг, который будет регистрировать файл или базу данных, или переменную сеанса, которую я выполняю, и по завершении пакетного файла установите сервлет или флаг, который зарегистрирует файл или базу данных или переменная сеанса, которую я освобождаю

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

Когда пользователь отправляет кнопку «Отправить», проверьте наличие флага или нет, в зависимости от того, предупредили ли вы своего клиента.

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