2016-09-26 33 views
1

我是Java和EJB多線程的新手。我有一個場景,我必須使用線程同時擊中一個Web服務。對此我有兩種方法。當我們可以使用ExecutorService時,爲什麼在EJB中使用@Asynchronous?

  1. 使用帶Callable的ExecutorService同時擊中服務。
  2. 使用EJB的@Asynchronous註釋。

我讀到的是:EJB建議在編寫我們自己的線程實現時使用@Asynchronous。閱讀完這篇文章後,我對EJB爲什麼這麼說會感到困惑。因爲EJB的底層工作在JVM上,所有線程都將從JVM創建。那麼爲什麼EJB限制我們使用@Asynchronous而不是我們的實現。

我在谷歌搜索,但沒有找到任何滿意的答案。如果有人知道EJB中線程創建和管理的細節,請清除我的疑惑。

回答

1

基本上,答案可以在EJB 3.1 specification發現:

企業bean不能試圖管理線程。企業bean不得嘗試啓動,停止,掛起或恢復線程,或者更改線程的優先級或名稱。企業bean不能嘗試管理線程組。

這些函數是爲EJB容器保留的。允許企業bean管理線程會降低容器正確管理運行時環境的能力。

我猜這個解釋本身就說明了。 Java EE通常在應用程序服務器上的容器中實現,並且該規範旨在爲容器提供有效執行其工作的最佳條件。

我能想到的另一個原因,我想Java EE規範存在的一個原因是它允許重用。可以這麼說,沒有必要重新發明輪子。

0

下面是更多的一些信息

對於EJB:

  1. 您需要具有EJB容器,以便它可以運行EJB的應用服務器(如:Jboss的程序,或WebLogic)。
  2. 像消息驅動Bean(MDB)這樣的EJB可以偵聽隊列(例如:Hornet Queue,RabbitMQ,IBM mq)等,並在消息被丟棄到Queue上時處理該請求。

  3. MDB的調用由容器控制,我們不需要編寫任何代碼額外的代碼。

的ExecutorService:

  1. 它由核心Java提供的,所以你不必像JBoss或Weblogic的一個應用服務器可以運行它作爲您的獨立的Java代碼部分。
  2. 您需要編寫一些代碼作爲何時啓動線程以及何時結束等,這是您使用ExecutorService實現的目標。

注意:根據您的要求,您的選項1對我來說似乎是正確的。 「與Callable一起使用ExecutorService來同時擊中服務。」

相關問題