2014-10-01 16 views
1

在EJB環境中,我可以如何強制與資源集合中的任何給定資源進行交互以實現單線程,而不會限制對集合本身的訪問?我想讓一個線程與資源A交互,而另一個線程與資源B交互;但禁止兩個線程同時與同一資源進行交互。EJB強制對資源集合的單個成員進行單線程訪問

背景故事: 我在網絡上有多個設備,並且我的應用程序中有多個線程可能想與任何給定設備通信。這些設備本身是愚蠢的,沒有會話的概念,這意味着,沒有訪問控制機制,很可能從不同線程到同一設備的消息將交織。

設備池可能有數百個,但不是數千個。它也有點動態 - 設備出現並下降。

我可以推出自己的類來管理單個設備的併發性,爲每個設備實例化一個,然後擁有一個管理集合並將請求分發給各個實例的單例bean。

但是大多數或所有這些都必須已經在Java的併發機制中的某個地方處理過了嗎?

這裏有一個行之有效的模式,我應該使用?

+0

隨着單身EJB容器可以同步每個併發請求允許一些功能在單一線程模型執行。 我知道你已經想過使用Singleton EJB,但是我不清楚爲什麼這不適合你的問題。 – 2014-10-01 21:40:44

+0

您將如何使用單例EJB實現我想要實現的目標,即允許多個線程並行訪問多個設備,但對於任何一個設備,一次只能有一個線程訪問它。缺少(手動)爲每個設備創建單獨的單例EJB,我還能做什麼? – 2014-10-01 23:00:01

回答

1

您確定要爲此使用EJB嗎?混合標準的Java併發機制和JavaEE的是相當氣餒......

參見: why-spawning-threads-in-java-ee-container-is-discouraged

+0

我沒有直接產生任何線程 - 我將所有東西都留給實現JSR-236的容器。容器可能有多個線程正在運行,每個線程都可能試圖與給定設備進行通信,這是問題出現的地方。 – 2014-10-01 18:47:45

+0

好吧,如果我是你,我會讓這些線程訪問單個Singleron EJB。我會用@ConcurrencyManagement(BEAN)對它進行註釋,並且自己實現必要的同步機制。 – cichystefan 2014-10-03 18:06:05