我正在尝试在谷歌应用程序引擎中使用executor框架。Bellow是我试图运行的代码。
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类。那么我哪里做错了呢?
Saikat,
你应该尽量避免在应用程序引擎上创建线程,因为它是分布式的和动态的,它往往会产生非常糟糕/意外的结果。
在您的情况下,多个实例将生成多次发送相同通知的多个(本地)线程。此外,请记住,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>
将在每周一8:30向/weeklreport发出HTTP请求。