問題:このサービスが開始されたときにDBがオフラインの場合、このサービスはこの行の中で失敗するため開始しません。開始時にはvar container = new BootStrapper().Container;
です。dbがcastle windsorとnhibernate facilityを使用してオフラインになっている場合、Windowsサービスの起動を再試行する方法はありますか?
private static void Main(string[] args)
{
Logger.Info("Engine Service is bootstrapping...");
AppDomain.CurrentDomain.UnhandledException += UncaughtExceptions.DomainException;
Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
var container = new BootStrapper().Container;
var controller = container.Resolve<EngineController>();
ServiceBase.Run(controller.MainView as ServiceBase);
container.Dispose();
}
それはそれはそれはNHibernateは施設container.AddFacility<NHibernateFacility>();
を追加し、接続タイムアウトで失敗し、このコードを実行されることがある失敗した理由。
public void Install(IWindsorContainer container, IConfigurationStore store)
{
var isAutoTxFacilityRegistered = container.Kernel.GetFacilities().Any(f => f is AutoTxFacility);
if (!isAutoTxFacilityRegistered) container.AddFacility<AutoTxFacility>();
container.Register(
Component.For<INHibernateInstaller>().ImplementedBy<CieFluentInstaller>().IsDefault().LifestyleTransient(),
Classes.FromThisAssembly().Pick().WithService.DefaultInterfaces().LifestyleTransient()
);
var isNHibernateFacilityRegistered = container.Kernel.GetFacilities().Any(f => f is NHibernateFacility);
if (!isNHibernateFacilityRegistered) container.AddFacility<NHibernateFacility>();
}
Windowsサービスが起動している場合は、アプリケーションサービスの開始に失敗した(それは更新やバックアップがDB上で行われている可能性がある場合)30秒よりも長くかかります。
私はFluentNhibernate、NHibernate、NHibernateFacilityのCastle Windsorを使用しています。私が試した
物事:それ はビューまたはコントローラに到達する前に、それが失敗したので
は、サービス開始イベントからそれを行うことはできません。ビューとコントローラには、IoCコンテナに直接アクセスする がありません。城ウィンザーの推奨に従って注入されたIoCFactory を介してのみです。
私は再試行ループをメインにスレッドを生成し、 であり、それを始めることを試みましたが、 ServiceBase.Runメソッド内サービス「待機」ので、私は正しいのように見えることはできません再試行ループ中に に戻って "偽の開始"にします。
は、サービス開始のタイムアウトを長く研究し、それはその前に失敗し、生産現場の何百ものシステム全体の 変更はオプションではありませんので、 servicebase /ビューにアクセスすることはできません。
質問:設計上、DBがオフラインのときにWindowsサービスが "開始"するようにするにはどうすればよいですか?
最初に "none"に設定する必要がある "hbm2ddl.keywords"を必要とするNHibernateの問題のため、これは私の2番目の箇条書きの点よりもうまくいっていませんでした。 –
はい、私の構造にはより広いアプリケーションがあります。たとえば、サービスが作業を開始する前にデータベースから情報を読み取ったり、クライアント要求のリスンを開始したりする必要がある場合があります。 –