簡體   English   中英

Websphere崩潰之前,如何在Java中執行特定方法?

[英]How to execute a particular method in java before websphere goes down?

我在Java應用程序中有一份工作,該工作每5分鍾使用Spring JDBC從Oracle數據庫讀取數據。 Java應用程序正在WebSphere Application Server上運行。 它加載狀態為“ X”的記錄,在加載記錄后將其狀態更改為“ Y”。 我們一次讀取1萬條記錄,並為某些處理向10個線程中的每個線程提供1k條記錄。

處理完每條記錄后,記錄狀態將變為“ Z”。 現在,如果在處理諸如outOfMemory錯誤之類的記錄時出現問題並且WebSphere發生故障,則記錄狀態仍為“ Y”。

因此,下次服務器啟動時,作業將開始讀取狀態為“ X”的記錄。 但是,狀態為“ Y”的未處理記錄將永遠不會被加載。 那么,當WebSphere出現故障時,有什么方法可以調用方法嗎? 我可以在其中編寫一段代碼,使未處理的記錄的狀態變為“ X”,以便下次服務器啟動時可以選擇它們。

如果應用程序遇到了OutOfMemoryError ,實際上沒有可靠的方法讓您確保在關閉之前執行某些代碼(實際上, OutOfMemoryError不會使進程本身死亡,但這無關緊要-如果您“您無法確定自己在該過程中將無法執行任何操作)。

您應該做的是擺脫“ Y”狀態。 只要確保讀取項目的作業不會多次執行即可(請參見下文)。 然后,您應該能夠讀取項目,將其發送出去進行處理,完成后只需將狀態設置為“ Z”(最好與處理每個項目的事務相同)。

現在,您無需指定每五分鍾開始工作的方式,所以我僅假設您為此使用Spring的調度功能。 在這種情況下, 只要作業仍在運行 ,就永遠不會被解雇。 這意味着您的工作需要跟蹤已發送的項目,並等待它們完成后再退出。 這可以使用ExecutorCompletionService完成。 將每個子任務(即1k條記錄的大塊)發送到相同的ExecutorCompletionService並輪詢剩下的任務,以完成任務。 當所有子任務都返回后,您可以安全地退出父作業。

這樣做的另一種方法(如果由於某些特定原因而需要“ Y”狀態)將是在啟動時檢查“ Y”記錄,例如,使用@PostConstruct注釋的方法

當您用spring標記問題時,您應該僅使用具有destroy-method方法的單例bean:當應用程序上下文關閉時,它將被銷毀;而當應用程序本身停止時,它將被銷毀。

XML: <bean class="..." destroy-method="destroy"/>

JavaConfig:

@Bean(destroy-method = "destroy")
public class ... {
    public void destroy() {
        // do you cleanup
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM