2017-10-11 67 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不是免費的,這會給您的應用程序增加網絡延遲並增加成本。