2017-10-05 92 views
2

我有一臺服務器,其中有48個CPU託管TomEE + 7.0.2上的Java EE 7 REST API。TomEE中的託管執行程序服務

某些API需要儘可能多地使用CPU,因爲它們運行的​​是並行算法。 並行化部分不需要任何數據庫或其他資源,只需要在共享double [] []矩陣中進行一些繁重工作。

我通常在EJB上下文中工作,但對於這個特定的實例,它不是一個需求(也不是最好的)。

到目前爲止我用

ExecutorService pool = Executors.newFixedThreadPool(maxThreads); 

,以實例的執行者,但因爲這似乎產卵於操作系統級別的實際線程我不是它的忠實粉絲 - 後一些JMeter的負載測試它甚至引發了一個問題,整個bash被阻塞,我甚至無法再通過SSH連接服務器,直到硬重啓。

我偶然發現了「託管執行程序服務」的概念,但我無法在線找到有關如何使用該目錄的教程/示例(並對其進行配置)。

難道有人可以分享下面的想法嗎?

a)如何在TomEE中配置線程池(例如,通過server.xml,context.xml或tomee.xml),代碼示例將不勝感激?

b)有沒有辦法只使用一些默認線程池(並且足夠聰明以至於不需要調整,如果不需要,我可以從哪裏開始調整)?

c)如何查找Java中的線程池然後 - 首選通過JDNI查找?

d)如果我曾經決定讓這個資源成爲EJB的一部分,那麼注入的代碼是什麼樣的?

我的應用程序上下文在server.xml中被指定爲「myContext」,所以如果您提供樣本,請指出查找字符串的樣子是怎樣的?

除此之外,我有一個非常簡單的安裝TomEE + 7.0.2,到目前爲止我沒有觸及任何配置。

非常感謝您的幫助!

丹尼爾

回答

0

這裏的上手一個很好的教程:https://martinsdeveloperworld.wordpress.com/2014/02/25/using-java-ees-managedexecutorservice-to-asynchronously-execute-transactions/

如果注入@ManagedExecutorService,TomEE應該給你一個默認的服務和游泳池。如果沒有,那可能是一個錯誤:

@Resource 
private ManagedExecutorService mes; 

您應該能夠配置它在TomEE.xml這樣的(我沒有測試這一點):

<Resource id="myManagedExecutorService" type="javax.enterprise.concurrent.ManagedExecutorService"> 
    Core = 5 
    Max = 25 
    KeepAlive = 5 s 
    Queue = 15 
    WaitAtShutdown = 30 seconds 
</Resource> 

而在你的代碼:

@Resource("myManagedExecutorService") 
private ManagedExecutorService mes; 

我通過查看service-jar.xml來解決這個問題。您可能還希望JMS和@Asyncronous這是有點比ManagedExecutorService更好的選擇,在我看來

0

,你可以在這裏找到http://tomee.apache.org/admin/configuration/resources.html#_managedexecutorservice

的文檔,這些執行者的主要優點是:

  1. 它在容器中配置 - 不需要定製應用程序配置,但它仍然可以調整,無需重新編譯/更改應用程序
  2. 它不受像@Asynchronous的限制,因爲它沒有定義任何特定池,因此可移植性不是很高EAS這些託管池是相當均勻
  3. 這些池是「企業」友好的,因爲你的聽衆添加安全和審計
  4. 這些池傳播某些方面(安全和JNDI /典型的類加載器)

在tomee我們ali