Quartz.Net 创建作业插件架构
Quartz.Net Create Job Plugin Architecture
我正在开发 Quartz.Net 网络 API。我目前正在尝试创建一个插件架构,用于将 IJob
作为插件加载。
目前,我可以从插件目录加载程序集。
private void LoadPlugins(ISchedulerFactory factory)
{
var scheduler = factory.GetScheduler().Result;
string folder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\Plugins";
if (Directory.Exists(folder))
{
string[] files = Directory.GetFiles(folder, "*.dll");
foreach (string file in files)
{
Assembly plugin = AppDomain.CurrentDomain.Load(File.ReadAllBytes(file));
foreach (var t in plugin.GetTypes())
{
if (t.GetInterfaces().Any(i => i == typeof(IJob)))
{
scheduler.AddJob(JobBuilder.Create(t).WithIdentity(t.Name + " Job").StoreDurably().Build(), true).Wait();
}
}
}
}
}
Quartz.Net 调度程序确实添加了作业。
如果我调用 Quartz.Net scheduler.CheckExists(AJobKeyFromThePlugin)
那么它会 return 为真。
但是,在应用程序的后期,如果我尝试从调度程序中获取```JobDetail``,我会得到以下异常。
Couldn't retrieve job because a required type was not found: Could not load type...
我试图在静态加载列表中保留已加载插件程序集的列表,但这似乎没有帮助。
我怎样才能更好地加载程序集以便 Quartz.Net 可以看到它们?
您需要实施 ITypeLoadHelper
并配置 Quartz.net 以使用您的 TypeLoadHelper。
Quartz.Net 属性
"quartz.scheduler.typeLoadHelper.type"
我正在开发 Quartz.Net 网络 API。我目前正在尝试创建一个插件架构,用于将 IJob
作为插件加载。
目前,我可以从插件目录加载程序集。
private void LoadPlugins(ISchedulerFactory factory)
{
var scheduler = factory.GetScheduler().Result;
string folder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\Plugins";
if (Directory.Exists(folder))
{
string[] files = Directory.GetFiles(folder, "*.dll");
foreach (string file in files)
{
Assembly plugin = AppDomain.CurrentDomain.Load(File.ReadAllBytes(file));
foreach (var t in plugin.GetTypes())
{
if (t.GetInterfaces().Any(i => i == typeof(IJob)))
{
scheduler.AddJob(JobBuilder.Create(t).WithIdentity(t.Name + " Job").StoreDurably().Build(), true).Wait();
}
}
}
}
}
Quartz.Net 调度程序确实添加了作业。
如果我调用 Quartz.Net scheduler.CheckExists(AJobKeyFromThePlugin)
那么它会 return 为真。
但是,在应用程序的后期,如果我尝试从调度程序中获取```JobDetail``,我会得到以下异常。
Couldn't retrieve job because a required type was not found: Could not load type...
我试图在静态加载列表中保留已加载插件程序集的列表,但这似乎没有帮助。
我怎样才能更好地加载程序集以便 Quartz.Net 可以看到它们?
您需要实施 ITypeLoadHelper
并配置 Quartz.net 以使用您的 TypeLoadHelper。
Quartz.Net 属性
"quartz.scheduler.typeLoadHelper.type"