2013-06-24 42 views
0

[我們正在使用JBoss 6,但我相信這個問題適用於任何JaveEE應用服務器]如何在Java應用程序服務器上執行長時間運行的操作?

我們有一個應用程序服務器,其中(除其他事項外)應該進行一些真正的長時間運行的任務(可需要幾個小時)。

該任務是通過調用某個EJB函數觸發的,但到目前爲止,整個操作都在此函數調用中運行,因此在EJB事務中運行。這種事務超時很快,並且延長事務超時似乎並不是正確的解決方案。

整體任務可以很容易地分解爲加載/工作/存儲部分,所以似乎並沒有嚴格要求整個時間都有一個事務。

所以問題是:什麼是「正確」的方式來做到這一點?

回答

0

這樣做的一般正確方法是將這些任務作爲工作,然後異步處理它們。 Spring有一個內置的框架。但通常情況下,您可以將長期任務放在隊列中,將其單獨處理,然後通過電子郵件通知用戶,或者向用戶提供鏈接,以便他們檢查狀態。

1

我絕對要求你看看Quartz。這是以特定間隔安排任務的驚人工具。我們在我們的一個項目中使用了Quartz,這非常棒。我們的場景是以Excel文件的形式從post中使用輸入,然後異步處理那些可能需要很長時間的巨大exces,我們所做的就是接受輸入並安排一個作業在1秒後運行。 Spring還支持使用石英作業計劃,而Jboss則預先包裝了石英。

+0

感謝您的指點石英。我在哪裏可以找到關於此背後架構的更多信息?特別是,如何使用Quartz作業避免交易問題? – stmoebius

+0

你可以瀏覽夸脫網站本身的教程http://quartz-scheduler.org/documentation/quartz-2.x/tutorials/。對於事務,我們所做的只是將任務提交給Quartz,並且它將異步運行任務,以便我們可以將響應發回給用戶,然後定期刷新頁面以檢查更新。我相信你的情況也可以類似。 –

相關問題