【问题标题】:Quartz.Net Create Job Plugin ArchitectureQuartz.Net 创建作业插件架构
【发布时间】:2022-01-14 07:32:35
【问题描述】:

我正在开发 Quartz.Net Web 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) 那么它确实返回 true。

但是,在应用程序的最后一点,如果我尝试从调度程序获取 ```JobDetail``,我会得到以下异常。

Couldn't retrieve job because a required type was not found: Could not load type...

我试图将已加载插件程序集的列表保留在静态加载列表中,但这似乎没有帮助。

如何更好地加载程序集以便 Quartz.Net 可以看到它们?

【问题讨论】:

    标签: c# plugins quartz.net


    【解决方案1】:

    您需要实现ITypeLoadHelper 并配置 Quartz.net 以使用您的 TypeLoadHelper。

    Quartz.Net 属性

    "quartz.scheduler.typeLoadHelper.type"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-15
      相关资源
      最近更新 更多