2015-07-21 60 views
2

我想圍繞Spring批處理我的頭,雖然很多教程顯示了很好的代碼示例,但我覺得我錯過了「spring批處理引擎」的工作原理。Spring批處理 - 這個過程在哪裏運行

場景1 - 創建用戶時,在外部服務處創建用戶。

  1. Web請求
  2. CreateLocalUser()
  3. 推出工作CreateExternalUser()

CreateExternalUser()可能會失敗的,因爲很多的原因,所以我們希望能夠重試和記錄錯誤, Spring Batch可以爲我們做什麼。這也是一個與我們的本地用戶創建無關的解耦過程。

工作在哪裏運行?它是否會與web請求運行在同一線程中,這意味着最終用戶在獲取http狀態200之前必須等待作業完成?

想象一下,我有一個Web服務器和一個批處理服務器。我希望所有作業都可以在批處理服務器上運行,但作業本身可以從Web服務器啓動。春季批可以做到這一點?我是否需要某種類型的隊列,我可以從Web服務器寫入並從批處理服務器消耗,實際工作將從何處開始?

方案2 - 在巨大文件處理線,開始新的工作對於每個線在大文件

  1. 讀取線(1.000.000線)
  2. 用於使用從所述輸入參數的每一行開始新的作業文件。

處理1.000.000行很快,並且1.000.000個新作業將或多或少地同時啓動。這些運行在哪裏?他們是否對初始工作運行異步?我的服務器能夠處理所有這些或多或少的同時運行。

附加問題: 是否可以根據作業輸入參數查詢作業。即方案1,我想在我的網頁上使用Id 1234查看本地用戶時顯示CreateExternalUser作業狀態/錯誤。 CreateExternalUser工作具有輸入參數,用戶名:1​​234

回答

2

你有幾個問題在這裏讓我們通過他們去一次一個:

哪裏工作運行?它是否會與web請求運行在同一線程中,這意味着最終用戶在獲取http狀態200之前必須等待作業完成?

這取決於您的配置。如果你使用默認值,那麼是的。這項工作將在同一個線程中運行,用戶將被迫等到作業完成才能獲得200.這顯然不是一個好主意......

這就是爲什麼Spring Batch的SimpleJobLauncher可以讓你注入TaskExecutor。通過配置JobLauncher以使用異步TaskExecutor實現(例如,ThreadPoolTaskExecutor),作業將在不同的線程中執行,從而允許控制器的處理完成。

顯然,這是所有在單個JVM,這給我們帶來的下一個問題。

我想所有作業批處理服務器上運行,但就業本身可以從Web服務器啓動。春季批可以做到這一點?我是否需要某種類型的隊列,我可以從Web服務器寫入並從批處理服務器消耗,實際工作將從何處開始?

Spring Batch的包含模塊稱爲Spring Batch的整合。此模塊提供了各種功能,包括使用消息來啓動Spring批處理作業。您可以使用它來建立一個遠程「批處理」服務器,您可以從Web服務器與之通信。通信機制是Spring集成通道,因此支持由SI支持的任何消息傳遞選項(JMS,AMQP,REST等)。

方案2 - 在巨大的文件處理線,每條線
這個場景讓我想你會走上錯誤的道路爲您的設計開始新的工作。你能發表一個新的問題來闡述這個用例嗎?

其他問題:是否有可能基於作業輸入參數
工作參數是用來識別JobInstances和對作業標識的基本查詢作業。因此,是的,您可以根據參數確定單個作業運行。

+0

針對場景2的詳細說明:http://stackoverflow.com/questions/31558148/spring-batch-process-lines-in-huge-file-start-new-job-for-each-line – heuts

+0

謝謝!看這個https://github.com/spring-guides/gs-batch-processing個人讀者,作家,工作和步驟是有道理的。我無法包攬頭腦的是工作周圍的東西,如果這是春季批次的一部分或我需要管理自己的東西。即說我有10個工作。 3需要消耗AMQP並且一直運行。 3需要每小時運行一次(例如方案2),另外4個我可以在需要時手動啓動。我對Spring Batch瞭解的是如何定義Job的實際邏輯,而不是何時以及如何開始Job。我希望這是有道理的。 – heuts

+0

除此之外。假設我使用Spring Batch Admin連接我的解決方案,並運行消耗AMQP的作業,每個消息都將作爲管理中的作業顯示出來,還是將消耗的消息顯示爲一項作業。 – heuts