ThreadPool Executor не выполняет потоки в GAE

Я пытаюсь использовать среду исполнителя в движке Google App. Ниже приведен код, который я пытаюсь запустить.

Thread thread = ThreadManager.createBackgroundThread(new Runnable(){
            public void run(){
                          try{
                                  LOGGER.info( "Checking background thread");                            
                                  Thread.sleep(10);
                              }
                          catch (InterruptedException ex){
                                           throw new RuntimeException("Exception:", ex);
                              }
                         }
                    });
ScheduledThreadPoolExecutor executor = (ScheduledThreadPoolExecutor) Executors.newScheduledThreadPool(10, ThreadManager.backgroundThreadFactory());
executor.scheduleAtFixedRate(thread, 0, 30, TimeUnit.MINUTES);

Но это не начало потока. Но если я использую thread.start(), он работает правильно. Я проверил Белые классы, и он предоставляет классы Executor. Так где я делаю это неправильно?

1 ответ

Решение

Saikat,

Вы всегда должны стараться избегать создания потоков в App Engine, поскольку из-за его распределенного и динамического характера он обычно приводит к очень плохим / неожиданным результатам.

В вашем случае несколько экземпляров порождают несколько (локальных) потоков, отправляющих много раз одно и то же уведомление. Кроме того, имейте в виду, что экземпляры переднего плана GAE имеют ограничение в 1 минуту, поэтому по истечении этого времени сервер прервет этот запрос.

К счастью, App Engine предоставляет сервис Cron именно для таких ситуаций.

Служба Cron позволит вам запланировать выполнение задания в определенное время или в каждый заданный период. Когда cron запущен, GAE вызовет настроенный URL, чтобы вы могли выполнить свой процесс, в вашем случае отправьте уведомления.

Например:(по предоставленной ссылке)

 <cron>
    <url>/weeklyreport</url>
    <description>Mail out a weekly report</description>
    <schedule>every monday 08:30</schedule>
    <timezone>America/New_York</timezone>
  </cron>

будет делать HTTP-запрос на / еженедельный отчет каждый понедельник @8:30.

Другие вопросы по тегам