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.