在AppEngine标准环境中使用java创建线程

时间:2017-10-11 02:45:02

标签: java multithreading google-app-engine task-queue

我是Google Cloud Platform的新手。我正在使用AppEngine标准环境。我需要在java中创建线程,但我认为这不可能,是吗?

情况如下:

我需要为用户创建 Feed

有三个名为d1, d2, d3的数据库。

每当用户发送Feed请求时,Java都会创建三个线程,每个线程对应一个数据库。例如,d1为 t1,d2为t2,d3为t3 。这些线程必须异步运行才能获得更好的性能,然后将这3个线程中的数据合并并在响应中发送回用户。

我知道如何为此编写代码,但正如您所知,我需要线程来完成这项工作。如果AppEngine标准环境。不允许它然后我该怎么办?还有其他方法吗?

在GCP文档中,他们说:

  

要避免使用线程,请考虑任务队列

我读到了有关任务队列的信息。有两种类型的队列:Push和Pull。两者都是异步运行,但它们不会将响应发送回用户。我认为它们仅用于在后台完成任务。

您能告诉我如何实现目标吗?我需要学习哪些东西?

2 个答案:

答案 0 :(得分:2)

注意:答案完全基于文档,我不是java用户。

标准环境支持线程,但有限制。来自Threads

  

警告:线程是一个充满惊喜的强大功能。要了解有关在Java中使用线程的更多信息,我们建议您   Goetz, Java Concurrency in Practice

     

Java应用程序可以创建一个新线程,但也有一些   限制如何做到这一点。这些线程不能“活跃”了   请求创建它们。

     

应用程序可以

     
      
  • 实施java.lang.Runnable
  •   
  • 通过调用com.google.appengine.api.ThreadManager.currentRequestThreadFactory()创建一个线程工厂。
  •   
  • 调用工厂的newRequestThread方法,传入RunnablenewRequestThread(runnable)或使用工厂对象   归来的   com.google.appengine.api.ThreadManager.currentRequestThreadFactory()   使用ExecutorService(例如,通话   Executors.newCachedThreadPool(factory))。
  •   
     

但是,您必须使用ThreadManager上的某个方法来创建   你的线程。您不能自己调用​​new Thread()或使用。{   default thread factory

     

应用程序可以对当前线程执行操作,例如   为thread.interrupt()

     

每个请求仅限于50个并发请求线程。 Java   如果你尝试,运行时将抛出java.lang.IllegalStateException   在一个请求中创建超过50个线程。

     

使用线程时,请使用high level concurrency objects,例如   ExecutorRunnable。那些照顾许多微妙的但是   并发的重要细节,如Interruptsscheduling and bookkeeping

答案 1 :(得分:0)

实现所需内容的一种优雅方式是在应用程序中创建可参数化的端点

/runFeed?db=d1

来自你的&#34; main&#34;应用程序代码,您可以URLFetchService拨打fetchAsync来回复java.util.concurrent.Future<HTTPResponse>

这样可以更好地监控应用程序的功能。 这将增加您的应用程序的网络延迟并增加其成本,因为urlFetchService不是免费的。