Как реализовать максимум 3 попытки для запроса ресурса в rest api java

#java #jbpm #httpconnection #rest

#java #jbpm #httpconnection #rest

Вопрос:

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

Я просмотрел много статей, они сказали использовать что-то вроде :

 for(int i=0;i<3;i  )
{
  try
  {
  }
  catch(Exception e)
  {
    if(count<3)
    {
        count  ;
        countinue;
   }
}
  

Я пытался реализовать это, но это было выполнено всего за один запрос.

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

например, когда я делаю запрос через postman один раз, он должен проверять наличие одного.

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

Вот пример кода здесь :

     @PUT
    @Path("/{containerId}/assignnexttask")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response somemethod(@Context HttpHeaders headers, @PathParam("containerId") String containerId,
            @RequestBody String payload) throws JSONException {
        Variant v = RestUtils.getVariant(headers);
        String contentType = RestUtils.getContentType(headers);
        MarshallingFormat format = MarshallingFormat.fromType(contentType);
        // for loop is for maximum 3 attempts ,
        int count=0;
        for (int i = 0; i < 3; i  ) {
            try { 
              //here is some code 
            }
            catch(Exception e )
            {
               if(count<3)
               {
                  count  ;
                  continue;
               }
             }
         }
     }
  

Надеюсь, я смогу объяснить.Заранее спасибо.

Комментарии:

1. похоже, что переменная count объявлена на уровне класса. Скорее вам следует повторно инициализировать его как первую строку метода.

2. Спасибо Gaurav, это объявлено только внутри метода. По ошибке я удалил здесь.

3. Не могли бы вы показать обновленный код, пожалуйста? Чтобы помочь вам лучше?

4. обновлено. Пожалуйста, проверьте

5. Согласно текущему коду, это должно происходить так, как если вы делаете запрос и возникает какая-то ошибка, он пытается три раза внутренне, а затем выдает ошибку. В то время как вы хотите, чтобы, если use отправил запрос и возникла какая-либо ошибка, он должен дождаться другого запроса от use и продолжать попытки до 3 запросов от use, а затем выдать ошибку. Это правильное понимание?

Ответ №1:

Скорее вам следует обновить свой код, как показано ниже (пример псевдокода). (Предполагается, что при наличии ошибки в первом и втором запросах null должны быть возвращены как Response ).

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

 //class level variable to count the error
private static int count = 0;

    @PUT
        @Path("/{containerId}/assignnexttask")
        @Consumes(MediaType.APPLICATION_JSON)
        @Produces(MediaType.APPLICATION_JSON)
        public Response somemethod(@Context HttpHeaders headers, @PathParam("containerId") String containerId,
                @RequestBody String payload) throws JSONException {
            Variant v = RestUtils.getVariant(headers);
            String contentType = RestUtils.getContentType(headers);
            MarshallingFormat format = MarshallingFormat.fromType(contentType);
            // for loop is for maximum 3 attempts ,
            try { 
                  //here is some code

                   // count = 0 to make it ready for next request if no error
                   count = 0;
                   // Response data
                   return response;
            }
            catch(Exception e ) {
                   if(count<3)
                   {
                      count = count   1;
                      return null;
                   }
                   // count = 0 to make it ready for next request
                   count = 0;
                   throw e;
             }
        }
  

Ответ №2:

Нравится это?

 for(int i=0;;i  )
{
  try
  {
     doSomething();
     break;
  }
  catch(Throwable e)
  {
    if(i==2)
    {
       throw e;
    }
  }
}