1

У меня есть веб-приложение, мне нужно запустить процесс backgroung, который попадет в веб-сервис, после получения ответа он будет ждать несколько секунд (скажем, 30), а затем снова попадет в службу. Данные ответа могут варьироваться от очень малых до очень больших, поэтому я не хочу вызывать processagain, пока не закончу обработку данных. Таким образом, это рекурсивный вызов с задержкой по времени. Как я собираюсь сделать это:Рекурсивный вызов функции с задержкой по времени

  1. Добавить контекстListener в веб-приложение.

  2. В контекстеIntialized() метод вызывает invokeWebService(), т. Е. Метод для обращения к веб-службе.

  3. invokeWebService будет выглядеть как:

    invokeWebService() 
    { 
    
    //make request 
    
    //hit service 
    
    //get response 
    
    //process response 
    
    timeDelayInSeconds(30); 
    
    //recursive call 
    invokeWebService(); 
    
    } 
    

Pls. предлагаю ли я делать это правильно. Или идите с потоками или планировщиками. Pls. ответьте на примеры кода.

ответ

2

Вы можете использовать ScheduledExecutorService, which is part of the standard JDK since 1.5:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 
    Runnable r = new Runnable() { 

     @Override 
     public void run() { 
      invokeWebService(); 
     } 
    }; 

    scheduler.scheduleAtFixedRate(r, 0, 30, TimeUnit.SECONDS); 
+0

Спасибо, это было проще. – shashankaholic

+1

Ну, да, если вы знаете, что invoceWebService() не будет тратить больше времени, чем 30 секунд. Если нет, это нехорошее решение. –

1

Это не рекурсивно, но повторяется. У вас есть два выбора здесь:

  • Используйте таймер и TimerTask с scheduleAtFixedRate
  • Используйте Quartz с повторным графиком.

В кварце, вы можете создать повторяющееся расписание с этим кодом:

TriggerBuilder.newTrigger().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(30)) 
       .build() 
+0

Его не повторяется, так как я не хочу, чтобы двигаться вперед, пока я не обрабатывает ответ веб-сервис. – shashankaholic

+0

Да, это повторяется. То, как вы делаете это сейчас, в какой-то момент достигнет stackOverFlow, потому что вы вызываете свой код рекурсивно, но вы никогда не покидаете рекурсию. Идите, повторите способ сделать именно то, что вы хотите –

+0

Что именно repeatSecondlyForever() сделать. – shashankaholic

1

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

Кварц является полнофункциональным, открытым исходным кодом, работа службы планирования, которая может быть интегрирован с, или использоваться вдоль стороны практически любой Java EE или Java SE приложения

Учебники могут быть доступны here.

Как указано в here вы можете сделать что-то вроде этого:

JobDetail existingJobDetail = sched.getJobDetail(jobName, jobGroup); 
    if (existingJobDetail != null) { 
     List<JobExecutionContext> currentlyExecutingJobs = (List<JobExecutionContext>) sched.getCurrentlyExecutingJobs(); 
     for (JobExecutionContext jec : currentlyExecutingJobs) { 
      if(existingJobDetail.equals(jec.getJobDetail())) { 
       //String message = jobName + " is already running."; 
       //log.info(message); 
       //throw new JobExecutionException(message,false); 
      } 
     } 
     //sched.deleteJob(jobName, jobGroup); if you want to delete the scheduled but not-currently-running job 
    } 
+0

Я пытался с планировщиком, проблема в том, что время процесса варьируется от 2 до 30 минут в зависимости от данных ответа. Если я получаю триггерное время как 30 минут, это будет слишком много для процесса, и если я возьму 2, следующий процесс будет завершен до того, как fisrt будет завершен. – shashankaholic

+0

@shashankaholic: Кварц, кажется, обеспечивает некоторый механизм, чтобы делать то, что вам нужно. – npinti

+0

Спасибо. Можете ли вы сказать мне, если аннотация @DisallowConcurrentExecution над классом JOb поможет мне здесь. Если нет, то где именно мне нужно реализовать код, который вы указали. – shashankaholic

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