2014-02-27 12 views
0

我正在使用Spring開發Java項目。數據庫是Oracle 我們在連接到遠程隊列的容器中配置了一個消息監聽器。以下是我們做一次的onMessage被觸發觸發Java進程檢測記錄會議特定條件

  1. 解析消息
  2. 在數據庫中插入消息的步驟。
  3. 基於消息的內容做有關文件處理,數據庫插入/更新等一些額外的過程..

如果隊列中接收到的消息是好的,因爲我們這邊的一些問題,我們無法處理它,我們沒有辦法在等待一段時間後重新處理消息[假設觸發錯誤的問題得到解決]。

以下是提出的新設計。 1.解析消息 2.使用標誌將消息插入數據庫中。說「錯誤」[該標誌只有在郵件成功處理時纔會被更改。]

要添加的新進程要查詢數據庫中標記爲「false」的記錄[一次一個],處理它並更新該標誌爲true。如果處理失敗,請重試可配置的時間量以處理相同的記錄。該過程可以死,如果沒有更多的記錄處理或已用盡的重試次數...

請提出合理的設計方案,其處理在儘可能早的時間檢測標記爲「假」的記錄消息

  1. 觸發一個java程序使用數據庫觸發器?[DBA是反對]
  2. 是否有數據庫插入完成,也不會妨礙下一信息的檢索之後,我們可以觸發過程中onMessage方法的方法嗎?
  3. 調度定期輪詢數據庫的作業嗎?
+0

您的處理代碼是否必須使用Java或可以使用PL/SQL? – OldProgrammer

+0

它必須在Java中 – user3255168

回答

1

這可以在春季用@Async註釋完成。此註釋允許在插入完成後異步啓動任務。

這意味着在運行@Async操作時插入的線程不會被阻塞,並且它將立即返回。

根據配置的任務執行程序,@Async將在單獨的線程中執行,這是您在這種情況下需要的。我建議從SimpleAsyncTaskExecutor開始,請參閱here可用的不同任務執行程序是什麼。

查看此Spring tutorial瞭解更多信息。

1

由於您已經在使用Spring Integration,爲什麼不將增強型消息發送到新通道並在那裏處理呢?如果頻道是QueueChannel,則處理將是異步的。還有可用的重試功能。

+0

如果重試失敗,應用程序預計會關閉。當應用程序再次出現時,我們需要處理消息。[當時消息在隊列中不可用,因爲我們不會在故障時將其推回到隊列中] – user3255168

+0

當重試失敗(但由您決定)時,不需要應用程序失敗。我猜你已經在某個地方堅持了信息?因此,您可能需要有一個後臺進程,或者只是啓動時觸發的一個單一操作,以處理仍然失敗但未處理的消息。在這一點上,這是一個開放式問題,所以我認爲你應該嘗試一些,然後再回答更多關於特定主題的問題。 –

+0

感謝戴夫....更確切地說..我需要實現一個進程,只要它被插入到數據庫中,就會從表中選擇消息[數據被MQ監聽器持久化]。實現這一點的最佳方式是反映好像消息剛剛從隊列中出來[在非錯誤場景中]? – user3255168