1

QuartzをWindowsサービスとしてセットアップし(重要な場合はAdoJobStoreを使用)、自分のプロジェクトCompany.ProjectにあるカスタムIJobを追加/スケジュールするために、リモート処理を介してASP.NETサイトと通信できるようになりました。 ServiceLayer。

これにはしばらく時間がかかりましたが、Company.Project.ServiceLayer.dllがWindowsサービスフォルダーとWebサイトのbinフォルダーの両方に存在する場合、開発マシンではすべて正常に機能します。ただし、実稼働環境では、Company.Project.ServiceLayer.dllをGACに追加する必要があります。私は自分の開発マシンでこれをシミュレートしようとしました。ServicesフォルダーからCompany.Project.ServiceLayer.dllを削除し、gacutilを使用してGACに追加しました。残念ながら、サービスが起動してIJobインスタンスをインスタンス化しようとすると、GACからアセンブリを読み込めず、「ファイルまたはアセンブリを読み込めませんでした」という例外がスローされます(詳細は以下を参照)。

Quartzは、[QRTZ_JOB_DETAILS]。[JOB_CLASS_NAME]フィールドのDB値とともにリフレクションを使用して、クラスをロードしようとしていると思いますか?私は完全に間違っている可能性がありますが、この値( "Company.Product.ServiceLayer.SchedulerJobs.QuintilesEasyJob、Company.Product.ServiceLayer")はクラスの部分的な説明にすぎないため(バージョンと公開鍵トークンがない)、そうではありません。 .NETがGACを調べないのは、強力な名前のdllのみがそこに存在できるリフレクションcozを実行する場合です。それが私のGACセットアップが失敗している理由ですか?Quartz WindowsサービスはGACのdllで動作する可能性がありますか?

どんな援助も大歓迎です。


2012-10-30 11:20:20,203 [4560] ERROR Topshelf.Model.ServiceCoordinator.OnServiceFault(:0) - Fault on quartz.server: Topshelf.Exceptions.ServiceControlException
Service Start Exception: quartz.server (IQuartzServer)
   at Topshelf.Builders.LocalServiceBuilder`1.StartService(T service)
   at Topshelf.Model.LocalServiceController`1.CallAction[TBefore,TComplete](String text, Action`1 callback, Func`1 before, Func`1 complete)
HelpLink:

Quartz.SchedulerConfigException
Failure occured during job recovery.
   at Quartz.Impl.AdoJobStore.JobStoreSupport.SchedulerStarted() in c:\Work\OpenSource\quartznet\src\Quartz\Impl\AdoJobStore\JobStoreSupport.cs:line 591
   at Quartz.Core.QuartzScheduler.Start() in c:\Work\OpenSource\quartznet\src\Quartz\Core\QuartzScheduler.cs:line 440
   at Quartz.Server.QuartzServer.Start()
   at Topshelf.Builders.LocalServiceBuilder`1.StartService(T service)
HelpLink:

Quartz.JobPersistenceException
Couldn't store trigger 'default.remotelyAddedTrigger' for 'default.remotelyAddedJob' job: Could not load file or assembly 'Company.Product.ServiceLayer' or one of its dependencies. The system cannot find the file specified.
   at Quartz.Impl.AdoJobStore.JobStoreSupport.StoreTrigger(ConnectionAndTransactionHolder conn, IOperableTrigger newTrigger, IJobDetail job, Boolean replaceExisting, String state, Boolean forceState, Boolean recovering) in c:\Work\OpenSource\quartznet\src\Quartz\Impl\AdoJobStore\JobStoreSupport.cs:line 1064
   at Quartz.Impl.AdoJobStore.JobStoreSupport.DoUpdateOfMisfiredTrigger(ConnectionAndTransactionHolder conn, IOperableTrigger trig, Boolean forceState, String newStateIfNotComplete, Boolean recovering) in c:\Work\OpenSource\quartznet\src\Quartz\Impl\AdoJobStore\JobStoreSupport.cs:line 876
   at Quartz.Impl.AdoJobStore.JobStoreSupport.RecoverMisfiredJobs(ConnectionAndTransactionHolder conn, Boolean recovering) in c:\Work\OpenSource\quartznet\src\Quartz\Impl\AdoJobStore\JobStoreSupport.cs:line 814
   at Quartz.Impl.AdoJobStore.JobStoreSupport.RecoverJobs(ConnectionAndTransactionHolder conn) in c:\Work\OpenSource\quartznet\src\Quartz\Impl\AdoJobStore\JobStoreSupport.cs:line 760
   at Quartz.Impl.AdoJobStore.JobStoreSupport.<>c__DisplayClass74.<ExecuteInNonManagedTXLock>b__73(ConnectionAndTransactionHolder conn) in c:\Work\OpenSource\quartznet\src\Quartz\Impl\AdoJobStore\JobStoreSupport.cs:line 3411
   at Quartz.Impl.AdoJobStore.JobStoreSupport.ExecuteInNonManagedTXLock(String lockName, Func`2 txCallback) in c:\Work\OpenSource\quartznet\src\Quartz\Impl\AdoJobStore\JobStoreSupport.cs:line 3481
   at Quartz.Impl.AdoJobStore.JobStoreSupport.SchedulerStarted() in c:\Work\OpenSource\quartznet\src\Quartz\Impl\AdoJobStore\JobStoreSupport.cs:line 581
HelpLink:

System.IO.FileNotFoundException
Could not load file or assembly 'Company.Product.ServiceLayer' or one of its dependencies. The system cannot find the file specified.
   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type)
   at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName)
   at System.Type.GetType(String typeName, Boolean throwOnError)
   at Quartz.Simpl.SimpleTypeLoadHelper.LoadType(String name) in c:\Work\OpenSource\quartznet\src\Quartz\Simpl\SimpleTypeLoadHelper.cs:line 51
   at Quartz.Impl.AdoJobStore.StdAdoDelegate.SelectJobDetail(ConnectionAndTransactionHolder conn, JobKey jobKey, ITypeLoadHelper loadHelper) in c:\Work\OpenSource\quartznet\src\Quartz\Impl\AdoJobStore\StdAdoDelegate.cs:line 788
   at Quartz.Impl.AdoJobStore.JobStoreSupport.StoreTrigger(ConnectionAndTransactionHolder conn, IOperableTrigger newTrigger, IJobDetail job, Boolean replaceExisting, String state, Boolean forceState, Boolean recovering) in c:\Work\OpenSource\quartznet\src\Quartz\Impl\AdoJobStore\JobStoreSupport.cs:line 1041
4

2 に答える 2

1

StdAdoDelegateには、このための拡張ポイントがあります。メソッドGetStorableJobTypeNameをオーバーライドして、バージョンと厳密な名前の情報を含めることができます。現在、動作を変更するための構成スイッチがないため、SqlServerDelegateを拡張する必要があります(SQL Serverを使用している場合)。

したがって、派生クラスの新しいバージョンは、次のようになります。

protected override string GetStorableJobTypeName(Type jobType)
{
    return jobType.AssemblyQualifiedName;
}

デフォルトでは、Quartzは、バージョン管理の問題を軽減するために、タイプとアセンブリ名のみを含むアセンブリ修飾名のみを使用します。ただし、バージョン情報がタイプに含まれている場合は、データベースデータを手動で修正するか、dllバージョン番号が変更された場合にアセンブリバージョンリダイレクトを作成する必要があります。

于 2012-10-31T05:40:01.080 に答える
1

私はついにこれを自分で調べました。次のように、app.configのフル/ストロングネームマッピングに部分的な名前を追加することで、サービスにGACを検索させることができました。

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <qualifyAssembly partialName="Company.Product.ServiceLayer" fullName="Company.Product.ServiceLayer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=125c3f237e3350e4"/>
    </assemblyBinding>
  </runtime>
于 2012-10-31T16:44:25.030 に答える