none
hora dinamica para tarea programada en c# utilizando TriggerBuilder.Create() RRS feed

  • Pregunta

  • Buen día 

    para entraros un poco en contexto y resumiendo un poco 

    tengo una tabla PARAMETRO en mi base de datos oracle 

    tengo en ella un atributo que se llama hora y su valor es 11:20

    tengo mi tarea programada programada de la siguiente forma

    ITrigger every24hJobTrigger = TriggerBuilder.Create()
                        .WithIdentity("cada24h", "app")
                        .StartAt(DateBuilder.DateOf(10,05), 0))
                        .WithSimpleSchedule(s => s
                            .WithIntervalInHours(24)
                            .RepeatForever())
                        .Build();

    hasta aquí todo bien, el método funciona correctamente se ejecuta a las 10:05 cada 24 horas

    lo que pasa es que por X o Y motivo necesito cambiar la hora digamos que a las 13:00, cambio el valor en el registro de la tabla antes mencionada entonces intento hacer algo como esto 

    estoy utilizando MCV 5 patrón repository

    ITrigger every24hJobTrigger = TriggerBuilder.Create() .WithIdentity("cada24h", "app") .StartAt(DateBuilder.DateOf(Convert.ToInt32(new Repository<PARAMETRO>().Find(j => j.NOMBRE == "HORA").FirstOrDefault().VALOR),

    Convert.ToInt32(new Repository<PARAMETRO>().Find(j => j.NOMBRE == "MINUTOS").FirstOrDefault().VALOR), 0)) .WithSimpleSchedule(s => s .WithIntervalInHours(24) .RepeatForever()) .Build();


    cuando el sistema ejecuta el método por primera vez toma los datos que están en el registro y funciona bien

    cuando realizo el cambio de hora por medio de interfaz y guardo en la base de datos sigue tomando la hora anterior 

    entonces como puedo hacer para que esto me funcione ? muchas gracias 



    • Editado Juliancho9 viernes, 30 de noviembre de 2018 22:54
    viernes, 30 de noviembre de 2018 21:50

Todas las respuestas

  • hola

    lo primero que podria decirte es que separes un poco es codigo para que no sea una bola que no se entiende, puntualmente el StartAt()

    pasalo a variables asi puees poner un break en el codigo y evaluar que obtienes o quizas loguear o mostrar el valor

    var parametro = new Repository<PARAMETRO>();
    
    var hora = parametro.Find(j => j.NOMBRE == "HORA").FirstOrDefault();
    var minutos = parametro.Find(j => j.NOMBRE == "MINUTOS").FirstOrDefault();
    
    //resto codigo
    
            .StartAt(DateBuilder.DateOf(Convert.ToInt32(hora.VALOR)), Convert.ToInt32(minutos), 0))


    Algo que me llama la atencion como es que puede funcionar el DateBuilder.DateOf() si le pasas un horario unicamente

    pero bueno la idea es que puedas poner un break o inspeccionar que valor obtienes

    No se que hay dentro de Repository, pero recuerda que si usas entity framework debes crear una nueva instancia por cada request

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 30 de noviembre de 2018 22:33
  • Hola gracias por contestar.

    lo he puesto de esta manera 

    int hora = Convert.ToInt32(new business.Repository<PARAMETRO>().Find(j => j.NOMBRE == "HORA").FirstOrDefault().VALOR);
    
    int minutos = Convert.ToInt32(new business.Repository<PARAMETRO>().Find(j => j.NOMBRE == "MINUTOS").FirstOrDefault().VALOR);
    
                    ITrigger every24hTrigger = TriggerBuilder.Create()
                        .WithIdentity("cada24h", "app")                    
                        .StartAt(DateBuilder.DateOf(hora, minutos, 0))                
                        .WithSimpleSchedule(s => s
                            .WithIntervalInHours(24)
                            .RepeatForever())
                        .Build();

    cuando lo compilo el sistema va y lee los valores y funciona correctamente, cuando actualizo los valores en el registro de la base de datos esta parte del código no la actualiza, ya que solo se ejecuta una sola vez.

    int hora = Convert.ToInt32(new Repository<PARAMETRO>().Find(j => j.NOMBRE == "HORA").FirstOrDefault().VALOR);
    
    int minutos = Convert.ToInt32(new Repository<PARAMETRO>().Find(j => j.NOMBRE == "MINUTOS").FirstOrDefault().VALOR);
    

    con respecto al debbuger, el solo entra 1 sola vez y no vuelve a ejecutarse 

    Quindío - Colombia

    viernes, 30 de noviembre de 2018 22:52
  • Buen día  Pablo Rubio la marco como solución pero no es la solución a mi pregunta, puesto que la hora dinámica no se deja  modificar, esta solución sirve para cuando la hora es estática
    sábado, 1 de diciembre de 2018 14:10