es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Arquitectura de creación de plugins de trabajo de Quartz.Net

Estoy trabajando en una API web de Quartz.Net. Actualmente estoy intentando crear una arquitectura de plugins para cargar “IJob” como plugins.

Actualmente, puedo cargar las bibliotecas desde un directorio de plugins.

        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();
                    }
                }

            }
        }
    }

El planificador de Quartz.Net añade el trabajo.

Si llamo a la función “scheduler.CheckExists(AJobKeyFromThePlugin)” de Quartz.Net, devuelve verdadero.

Sin embargo, en una etapa posterior de la aplicación, si intento obtener el “JobDetail” del planificador, obtengo la siguiente excepción.

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

He intentado mantener una lista de las bibliotecas de plugins cargadas en una lista cargada estáticamente, pero eso no parece ayudar.

¿Cómo puedo cargar las bibliotecas de forma más efectiva para que Quartz.Net pueda verlas?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución para cargar ensamblados para Quartz.Net en la arquitectura de plugins

    Cuando se intenta crear una arquitectura de plugins para cargar IJob como plugins en un proyecto Quartz.Net Web API, puede ser necesario cargar los ensamblados de tal manera que Quartz.Net pueda verlos. Si no se hace esto correctamente, puede producirse una excepción al intentar obtener el JobDetail del planificador.

    Una posible solución es llamar al método scheduler.AddJob() con una sobrecarga que tome un parámetro de objeto IJobDetail. En lugar de proporcionar JobBuilder.Create(t), que crea un nuevo objeto de detalle de trabajo para cada trabajo, se puede llamar al método JobBuilder.Create(t).Build() para crear una instancia de detalle de trabajo que pueda ser referenciada más tarde por el código del ensamblado.

    “`c#
    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)))
        {
            var job = JobBuilder.Create().OfType(t);
            var jobDetail = job.Build();
    
            scheduler.AddJob(jobDetail, true).Wait();
        }
    }
    

    }


    Este enfoque garantiza que Quartz.Net tenga acceso a la información necesaria sobre los detalles del trabajo en los ensamblados cargados, y hace posible utilizar el método `scheduler.GetJobDetail()` más adelante para recuperar el detalle del trabajo. ```c# var jobKey = new JobKey("NombreDelTrabajo"); var jobDetail = scheduler.GetJobDetail(jobKey).Result;

    Al combinar este enfoque con otras medidas, como cargar los ensamblados de manera estática, si es necesario, se puede crear una arquitectura de plugins exitosa que se pueda utilizar con Quartz.Net.

Comments are closed.