2016-10-13 1 views
2

Я пытаюсь найти некоторые варианты для хранения сообщений о сообщениях в течение минуты в файле и повторять их каждый час. У меня около 3000 запросов в секунду, я хочу только сохранить сообщение с запросом в течение минуты, это даст мне около 180000 запросов на анализ. Но я хочу делать такой же анализ по запросу сообщений каждый час.Хранение запросов на сервлеты за минуту в файле за каждые интервалы в 1 час

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    try { 
     ServletInputStream inputStream = request.getInputStream(); 
     Reader reader = new InputStreamReader(inputStream); 
     requestMessage = gson.fromJson(reader, Request.class); 

     //I am trying to print requestMessage in one file for a minute at interval of 1 hour to do analysis on it 
     //(I am having around 3000 post requests per seconds) 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    response.setStatus(HttpServletResponse.SC_NO_CONTENT); 

} 

Я попытался с помощью ниже кода в Post метод, но он не работает должным образом, потому что он начнет новый график каждый раз, у меня есть новый запрос, и я поставил тот же код в инициализации() метод, но это не дает никакого выхода.

service = Executors.newSingleThreadScheduledExecutor(); 
service.scheduleAtFixedRate(new Runnable() { 
      @Override 
      public void run() { 
       System.out.println("Starting of 1 Hour time: "+new Date()); 
       ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor(); 

       exec.schedule(new Runnable(){ 
        @Override 
        public void run(){ 
         System.out.println("Starting of 1 minute: "+new Date()); 

         while(requestMessage.getID().equals("123")) 
         { 
          try { 
          System.out.println("Printing to File: "+new Date()); Files.write(Paths.get("location/requestMessage.txt"),requestMessage, StandardOpenOption.APPEND); 
          } catch (IOException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
          } 
         } 
        } 
       }, 1, TimeUnit.MINUTES); 
      } 
     }, 0, 1, TimeUnit.HOUR); 

Я как бы потерял здесь и искал некоторые варианты. Возможно ли это с помощью исполнителей или Thread? и если нет, то каковы другие варианты, которые я могу попробовать?

Спасибо!

+0

Это не ясно, «на минуту с интервалом в 1 час», не могли бы вы прояснить? –

+0

В идеале вы могли бы привести пример, чтобы уточнить? –

+0

Спасибо Николасу за ответ. Я попытался объяснить немного больше. – anghanravi

ответ

0

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

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); 
// Schedule the main task to be executed every one our 
service.scheduleAtFixedRate(
    new Runnable() { 
     @Override 
     public void run() { 
      // Get the initial time 
      long initial = System.currentTimeMillis(); 
      // Iterate as long as the current time - initial time is less than 60 K ms (1m) 
      do { 
       // Here is my recursive task that I want to do during 1 minute 
      } while ((System.currentTimeMillis() - initial) < 60_000L); 
     } 
    }, 0L, 1L, TimeUnit.HOURS 
); 
+0

Эй, еще раз спасибо за ответ. – anghanravi

+1

Я попытался использовать структуру вашего кода для метода init() в соответствии с моим использованием, и он сработал. Добавлен Thread.sleep (5); in do ... while цикл. – anghanravi