2012-10-30 53 views
1

該場景如下:如何在沒有數據庫的情況下管理java中的序列?

我正在使用Apache CXF向客戶端公開Web服務。 在收到請求並處理它之後,我需要爲處理的消息頭添加一個序列號,然後我通過MQ將它轉發給另一個程序。 另外我用Spring來處理bean管理和注入。

什麼是不使用DB來管理序列的最佳方法(因爲安裝DB只是順序管理似乎有一個巨大的開銷和膨脹)。 如果解決方案是使用文件(屬性文件?),如果發生任何異常,如何選擇一致性? 另外我需要在多個請求同時到達時序列保持一致。

+0

它必須是一個序列或獨特的ID足夠嗎? – beny23

+2

你有這個criteria..if一旦序列號被分配給它不應該在未來的任何點被分配到其他消息的一個消息頭......我想你可以使用的AtomicLong通過artplasticka – user533

+0

給它必須是一個序列,這意味着每個值都是以前的值+ 1 – Benchik

回答

2

如果一切同一個類加載器內的作品,你可以創建一個AtomicLong私人領域的單。

1

既然你將與MQ進行轉發,爲什麼不乾脆的MQ排序機制,而不是跟蹤自己嗎?

如果你想跟蹤自己,你應該考慮一個(同步)單少量發放數量。如果你想在重新啓動後維護序列,將需要一個持久性機制(儘管不一定是DB)。我敢肯定,人們可以工程師MQ隊列提供這項服務,儘管這將是瘋狂了的比例;-)

因此,看看MQ排序第一。

乾杯,

+0

MQ排序要求接收應用程序能夠檢索組中的消息。在我的情況下這個應用程序是一個黑匣子,因此我不知道它是否有這樣的能力。 – Benchik

+0

您聲明「...將序列號添加到已處理的消息頭中......」您是不是在說這裏的MQ消息?如果不是,你怎麼知道你的黑盒在另一端會理解消息體/值對象中的序列ID? –

+0

我確實在MQ上寫了一條消息,黑匣子知道如何讀取我放入消息正文中的序列號。但我不確定它是否知道如何讀取消息的MQ頭中的序列。 – Benchik

1

如果該服務只有一個實例,從System.currentTimeMillis()時間戳,這應該是足夠的大多數情況下。如果你可以使用一個字符串作爲標識符,我會建議使用時間戳字符串,加上納秒的時間。 如果你有在同一時間服務的Web服務的多個實例,你可能需要一個singelton計數器:

private static long counter = 0; 
private static synchronized long nextCounter() { 
    return counter++; 
} 

(您需要檢查溢出,當然)

大部分時間裏,我使用兩者的組合。

相關問題