2014-11-22 3 views
2

Я снова в поиске решения одного из лучших онлайн-центров решений.Как браузер обрабатывает несколько нажатий кнопки действий

@Path("/user/service") 
public class UserFeedService { 
    String status = "status_idle"; 
    String errorStatus = "ok"; 
    @POST 
    @Path("/register") 
    @Produces("application/json") 
    public String register() { 
     if (!status.equals("status_running")) { 
      registerUser(); 
      return errorStatus ; 
     } 
     return status ; 
    } 

    public void resgisterUser() { 
     synchronized { 
      status = "status_running" 
     } 
     //code below 
    } 
} 

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

Теперь я хочу, чтобы пользователь нажал кнопку при первом вызове веб-службы и установил статус "status_running", если пользователь снова нажимает кнопку, пока предыдущий служебный вызов все еще находится в прогресс, служба должна вернуть «status_running», который будет отображаться пользователю.

Но код, указанный выше, всегда возвращает errorStatus и не соответствует статусу, как ожидалось, при нескольких нажатиях кнопки.

Так что я делаю что-то здесь не так, или это как браузер работает, то он ждет первого звонка в службу по нажатию кнопки, чтобы закончить, а затем вызывает

+0

Hi peeskillet, я хотел бы внести небольшое изменение в мой вопрос. Я не хочу сохранять это состояние только для каждого отдельного пользователя, если пользователь 1 вызвал службу, и в то же время пользователь 2 пытается вызвать службу, beahaviour должен быть таким же, как описано выше в вопросе. хотя мне больше интересно узнать, что, когда пользователь дважды щелкает по кнопке действия, браузер отправляет два отдельных запроса одновременно или ждет, когда первый запрос завершит –

+0

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

ответ

0

Простой ответ на свой вопрос заключается в том, что UserFeedService, вероятно, воссоздается по каждому запросу, поэтому свойство status является другим экземпляром по умолчанию для каждого запроса (то есть он всегда является «status_idle» для каждого запроса). Изменение его на static должно привести к поведению, которое вы запрашиваете.

Однако, это очень плохая идея, чтобы ввести какое-то статическое состояние, подобное этому, в службу RESTful. Мало того, что будет сложно тестировать и отлаживать. Если вы действительно хотите, чтобы только одна регистрация могла возникать одновременно, лучше было бы экстернализировать состояние в каком-то хранилище данных.

Смежные вопросы