java - ThreadPoolExecutor 不执行 GAE 中的线程

标签 java google-app-engine threadpoolexecutor gae-backends

我正在尝试在 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() 它可以正常工作。我查过Whitelisted Classes它确实提供了 Executor 类。那么我哪里做错了?

最佳答案

赛卡特,

您应该始终尽量避免在 App Engine 上创建线程,因为它具有分布式和动态特性,因此往往会产生非常糟糕/意外的结果。

在您的情况下,多个实例将产生多个(本地)线程,多次发送相同的通知。另外,请记住 GAE 前端实例有1 分钟请求限制,因此在此之后服务器将终止该请求。

幸运的是 App Engine 提供了 Cron service正是针对这种情况。

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 都会向/weeklyreport 发出 HTTP 请求。

关于java - ThreadPoolExecutor 不执行 GAE 中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29209522/

相关文章:

java - 在 Java 中解码十六进制 NCR

java - 尽管设置了 setHasOptionsMenu(true),ActionBar 图标不会出现在 FragmentActivity 中

java - 如何强制在抽象类的所有子类中定义构造函数

java - 传递给 ThreadPoolExecutor/ScheduledThreadPoolExecutor 的推荐 corePoolSize 是多少?

java - 更改Hibernate中一对多单向关系中的外键约束名称

ruby - 在 google appengine 上部署 ruby​​ + sinatra 应用程序

java - GAE DataStore 复合索引无法工作/无法识别

mysql - 为什么 App Engine + Google Cloud SQL 会出现 "communication link failure"?

java - 为什么当队列溢出且所有线程都忙时拒绝处理程序不调用

java - ThreadPoolExecutor 中使用 BlockingQueue 的内存使用情况