我是Google Cloud Platform的新手。我正在使用AppEngine标准环境。我需要在java中创建线程,但我认为这不可能,是吗?
情况如下:
我需要为用户创建 Feed 。
有三个名为d1, d2, d3
的数据库。
每当用户发送Feed请求时,Java都会创建三个线程,每个线程对应一个数据库。例如,d1为 t1,d2为t2,d3为t3 。这些线程必须异步运行才能获得更好的性能,然后将这3个线程中的数据合并并在响应中发送回用户。
我知道如何为此编写代码,但正如您所知,我需要线程来完成这项工作。如果AppEngine标准环境。不允许它然后我该怎么办?还有其他方法吗?
在GCP文档中,他们说:
要避免使用线程,请考虑任务队列
我读到了有关任务队列的信息。有两种类型的队列:Push和Pull。两者都是异步运行,但它们不会将响应发送回用户。我认为它们仅用于在后台完成任务。
您能告诉我如何实现目标吗?我需要学习哪些东西?
答案 0 :(得分:2)
注意:答案完全基于文档,我不是java用户。
标准环境支持线程,但有限制。来自Threads:
警告:线程是一个充满惊喜的强大功能。要了解有关在Java中使用线程的更多信息,我们建议您 Goetz, Java Concurrency in Practice 。
Java应用程序可以创建一个新线程,但也有一些 限制如何做到这一点。这些线程不能“活跃”了 请求创建它们。
应用程序可以
- 实施
java.lang.Runnable
。- 通过调用
com.google.appengine.api.ThreadManager.currentRequestThreadFactory()
创建一个线程工厂。- 调用工厂的
newRequestThread
方法,传入Runnable
,newRequestThread(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,例如
Executor
和Runnable
。那些照顾许多微妙的但是 并发的重要细节,如Interrupts和scheduling and bookkeeping。
答案 1 :(得分:0)
实现所需内容的一种优雅方式是在应用程序中创建可参数化的端点
/runFeed?db=d1
来自你的" main"应用程序代码,您可以URLFetchService拨打fetchAsync
来回复java.util.concurrent.Future<HTTPResponse>
这样可以更好地监控应用程序的功能。 这将增加您的应用程序的网络延迟并增加其成本,因为urlFetchService不是免费的。