2017-10-11 42 views
1

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

这里的情况是:

我需要创建订阅供用户使用。

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

每当用户发送请求时,Java会创建三个线程,每个数据库一个线程。例如t1代表d1,t2代表d2和t3代表d3。这些线程必须异步运行才能获得更好的性能,之后将这3个线程的数据合并并发送回给用户。

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

在GCP文件,他们说:

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

我读到任务队列。有两种类型的队列:推和拉。两者都异步运行,但不会将回复发送回用户。我认为他们只是为了在后台完成任务而设计的。

你能告诉我如何实现我的目标吗?我需要为此学习什么?

回答

1

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

线程由标准环境支持,但有限制。从Threads

注意:线程是一个强大的功能,是充满惊喜。要了解有关在Java中使用线程的更多信息,我们推荐使用 Goetz,Java并发实践

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个并发请求线程。如果您尝试在一个请求中创建超过50个线程,则运行时Java将抛出java.lang.IllegalStateException

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

+0

当您从Cloud SQL获取数据时,我想再问一下mutliThread增加性能吗?我读了很多关于java的mutliThread性能的问题,但我认为这里的情况是变化我从其他机器的云端sql获取数据 –

+0

我会想象Cloud SQL将能够并行处理3个到3个数据库的请求,所以用户请求*应该*通过线程并行数据库操作获得更快的响应时间。 –

0

一种优雅的方式来实现,你需要将你的应用程序

/runFeed?db=d1 

从你的“主”应用程序代码来创建一个parametrable端点可以执行从URLFetchService一个fetchAsync通话将返回什么你一个java.util.concurrent.Future<HTTPResponse>

这将允许你更好地监测你的应用程序做什么。 由于urlFetchService不是免费的,这会给您的应用程序增加网络延迟并增加成本。