[英]How to execute a particular function before main() in C and 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.