2015-04-10 4 views
0

Я создаю небольшой проект электронного банкинга в Java для лучшего понимания RMI.Выполнять один и только один запрос за раз в RMI

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

Другими словами, давайте рассмотрим, есть ли клиент, который хочет внести деньги на свой банковский счет, поэтому клиентская программа отправит запрос на сервер, чтобы удаленно выполнить удаленный метод deposit(). Теперь давайте предположим, что запрос не может быть отправлен в какой-то момент, потому что некоторые ошибки, поэтому клиент отправит новый запрос, потому что сервер не получил первый. Второй запрос выполнен правильно. Предположим, что через некоторое время сервер получает первый запрос и выполняет его, вот и проблема: запрос был выполнен дважды, но клиент хотел внести деньги только один раз.

До сих пор я пытался добавить столбец в таблице Client (содержащий idClient и пароль и баланс) с именем idRequest, чтобы проверить, есть ли предыдущий запрос, отправленный перед его выполнением. Но это плохое решение.

Как я могу решить эту проблему лучше (без добавления нового столбца в таблицу данных клиента в базе данных, чтобы идентифицировать последний отправленный запрос)?

+0

Ваш вопрос не имеет смысла. Если первый запрос не может быть отправлен, как сервер может его получить? В общем случае, я предлагаю вам подробно ознакомиться с транзакцией * idempotence *. – EJP

+0

Я имею в виду, что запрос 1 отправляется первым. На данный момент сервер ничего не получает, поэтому клиент отправляет другой запрос 2, сервер получает запрос 2 и выполняет его, затем он получает запрос 1 и выполняет его. Запрос выполнялся дважды. Как предотвратить повторное выполнение сервером одного и того же запроса? Я хочу, чтобы он выполнялся только один раз, другие запросы должны быть отклонены. –

ответ

0

Ваш вопрос не имеет смысла. Ситуация, которую вы описываете, невозможна. Клиент RMI не может вызывать второй удаленный метод до тех пор, пока не вернется первый удаленный метод, если он не многопоточен, и в этом случае решение simpe должно удалить многопоточность. И когда метод возвращает, он полностью выполняется на сервере.

TCP также предотвращает выход данных из последовательности, хотя RMI может использовать несколько соединений, что делает это немного неуместным.

Вы также должны знать, что RMI имеет семантику доставки «по крайней мере один раз».

Вы, кажется, изобретаете проблемы там, где их нет.

Вы также должны искать «транзакционную идемпотенцию» по другим причинам.

+0

Я понял. Благодарю. –