2017-06-21 51 views
0

我有一個相當複雜的應用程序(這是一個命令和控制中心彈簧+基於角度的應用程序,旨在供警察和其他應急中心控制器使用)。按正確順序處理方法/線程

應用程序的主要組件(讓我們稱之爲主幹[spring web app])與不同的應用程序/硬件進行通信。大部分通信都是通過使用RabbitMQ消息完成的(讓我們稱它們爲電報或簡稱爲TM)。

當創建骨幹新線程時收到其中一個TM,並在其中執行一些方法/方法。

問題在於它可能發生骨幹幾乎同時接收兩個或多個TM,並且由於它們在不同線程中執行,可能會發生這樣的情況,即它們未按照到達的順序進行調整,因此出現錯誤的信息呈現給用戶。

通常,我用Redis處理的這類問題。我有一個Redis的鎖,基本上看起來像這樣

distributedRedisLocker.lock(() -> { 
    executeSomeMethod(); 
}, howLongIsLockKept, howLongDoWeWaitForItToFinnish); 

但在這種情況下,我想避免使用Redis的,沒有任何其他的Java /基於彈簧的解決方案呢?

我不需要它與我擁有的redis鎖一樣,只是我想要的是TMs按照它們到達的順序被處理,並且如果它們中的一個在方法執行中某處失敗,它不會阻止下一個一個永遠。

+3

在像Executors.newSingleThreadExecutor()這樣的單線程執行程序中處理這些TM如何? –

+0

這聽起來很正確,會嘗試一下並更新進度。 – mirzak

回答

1

轉發爲答案。

解決您的問題的一種方法是避免併發。你可以使用Executors.newSingleThreadExecutor()只使用一個線程:

ExecutorService executor = Executors.newSingleThreadExecutor(); 

然後

executor.execute(...); 

executor.submit(...); 

這將幫助你避免競爭:如果一些TM A被添加到執行隊列由該執行者在一些TM B之前定義,然後A將作爲整體在B之前執行。除了可以包含在執行程序實現中的隱式鎖,但是它們被封裝並且不會在發生錯誤時永遠保持交付狀態),所以不涉及顯式鎖。

有一個微妙的時刻:如果兩個TMs在同一時間到達,那麼不可能預測哪個將會在更早和稍後添加。

+0

我想知道的是,如果我擁有不同類型的TM,並且如果我同時獲得兩個TM但具有不同類型,我希望它們立即執行,而不是等待第一個TMMS。這會起作用嗎? – mirzak

+0

不同類型的TM是否相互獨立?如果可以同時執行它們,則可以爲每個TM類型創建一個單線程執行程序,並在TM類型選擇的執行程序上執行TM。 –

+0

是的,它們是獨立的。將盡力去做。我在想它,我認爲這可以用java同步塊來完成。 – mirzak