我在ASP.NET MVC 5網站中使用Apache Ignite .NET EntityFramework二級緩存。在我的開發機器上,一切都按預期工作,但當我嘗試在生產IIS上使用Web Deploy發佈網站時,情況變得複雜。如何在IIS中發生網站重新啓動時檢索啓動的Ignite實例?
當我發佈或重新啓動IIS上的網站時,我總是得到一個class org.apache.ignite.IgniteException: Ignite instance with this name has already been started: GridName
。錯誤非常明顯,Ignite已在運行。
我發現擺脫此錯誤的唯一方法是重新啓動網站的應用程序池。但是,我不想每次在生產中發佈網站時都這樣做(每週發生幾次)。
我試着停止global.asax Dispose()或Application_End()中的Ignite實例,但事情是,AppDomain需要幾秒鐘才能停止。 Ignite因此有時間在停止之前嘗試自行啓動,並導致上述錯誤。
我也嘗試呼叫Ignition.TryGetIgnite()
來檢索正在運行的實例,而不是試圖啓動它,但它總是返回null。在Apache Ignite Github存儲庫中查看此函數的源代碼,我看到Ignition對象只是在內存中保留一個靜態的節點列表並在該列表上執行操作。由於此時AppDomain重新啓動,該列表爲空,但Ignite節點仍在JVM中運行。
有沒有辦法檢索Ignite實例或可靠地停止它,所以我不需要每次都重新啓動應用程序池?
感謝您提供詳細的解決方法!我已經在Ignite jira中提交了一張票:https://issues.apache.org/jira/browse/IGNITE-4856 –
我編輯了我的答案並提供了一個不需要捕獲異常的解決方案。 –