Динамическая конфигурация Время выполнения Spring Spring и параметры через настроенные параметры базы данных - PullRequest
0 голосов
/ 14 октября 2019

Я свежий пользователь партии весны, пожалуйста, помогите мне. Вот мое требование:

  1. Я выполнил несколько рабочих заданий с разными именами. Я хочу выполнить эти задания с разными параметрами задания и надеюсь, что эти параметры можно будет динамически настраивать в базе данных, поэтому я могу добавить новое выполнение задания с разными именами задания и разными параметрами.
  2. Кроме того, я хочу запланироватьвыполнение моей работы в другое время, и выражение crontab также может быть настроено.

Может быть, структура базы данных выглядит следующим образом:

  • id
  • task_name
  • spring_batch_job_name
  • cron_expression

Интересно, могут ли какие-то парни помочь мне. Большое спасибо!

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Вот мой объект установки задания:

@Entity
@Table(name = "report_tasks_manager", schema = "reconciliation", catalog = "")
public class ReportTasksManager {
    private int id;
    private String taskDesc;
    private String taskName;
// crontab expression 
    private String cronExpression;
// class name to execute job logic
    private String methodName;
    private int state;
    private Integer conCurrent;
    private String reserved1;
    private String reserved2;
    private String reserved3;
    private Timestamp startTime;
    private Timestamp endTime;
    private Timestamp createTime;
}

Я определил класс, который реализовал интерфейс Job, и метод execute () в этом классе выполняет бизнес-логику, как при запуске весеннего пакетного задания:

public class QuartzJobFactory implements Job {

    public QuartzJobFactory() {
    }

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("time ={" + new Date() + "}");
        System.out.println("starting job build factory");
        ReportTasksManager reportTasksManager = (ReportTasksManager) jobExecutionContext.getMergedJobDataMap().get("scheduleJob");
        System.out.println("job name = {" + reportTasksManager.getTaskName() + "}");
    }
}

Для регистрации триггера cron я определил контроллер покоя для проверки параметров задания в базе данных и настройки планировщика

@RestController
@RequestMapping(path = "test")
public class QuartzManager {

    private SchedulerFactory schedulerFactory = new StdSchedulerFactory();

    @Autowired
    private ReportTaskManagerDAO reportTaskManagerDAO;

    @GetMapping(value = "schedule")
    public void scheduleJob() {
//        Read settings from database
        List<ReportTasksManager> quartzList = reportTaskManagerDAO.findAll();
        if (quartzList.size() > 0) {
            quartzList.forEach(reportTasksManager -> {
                try {
                    configQuartz(reportTasksManager, schedulerFactory.getScheduler());
                } catch (SchedulerException | ClassNotFoundException e) {
                    e.printStackTrace();
                }
            });
        }
    }

    @SuppressWarnings("unchecked")
    private void configQuartz(ReportTasksManager reportTasksManager, Scheduler scheduler) throws SchedulerException, ClassNotFoundException {
        TriggerKey triggerKey = TriggerKey.triggerKey(reportTasksManager.getTaskName(), Scheduler.DEFAULT_GROUP);
//        check if triggers already defined in scheduler
        CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
        if (null == trigger) {
//            not define——new trigger&jobDetail
            JobDetail jobDetail =
                    JobBuilder.newJob((Class<? extends Job>) Class.forName(reportTasksManager.getMethodName()))
                            .withIdentity(reportTasksManager.getTaskName(), Scheduler.DEFAULT_GROUP)
                            .build();
            jobDetail.getJobDataMap().put("scheduleJob", reportTasksManager);
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(reportTasksManager.getCronExpression());
            trigger = TriggerBuilder.newTrigger()
                    .withIdentity(reportTasksManager.getTaskName(), Scheduler.DEFAULT_GROUP)
                    .withSchedule(scheduleBuilder)
                    .build();
            scheduler.scheduleJob(jobDetail, trigger);
            scheduler.start();
        } else {
//            already defined——update 
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(reportTasksManager.getCronExpression());
            trigger = trigger.getTriggerBuilder()
                    .withIdentity(triggerKey)
                    .withSchedule(scheduleBuilder)
                    .build();
            scheduler.rescheduleJob(triggerKey, trigger);
        }
    }

}
0 голосов
/ 15 октября 2019

Вы можете использовать создать некоторый класс Util (на @PostConstruct), который загружает конфигурацию вашей работы из БД.

Например:

     @Entity
        public class Configuration{

            @Id 
            private long id;

            private String field;


            private String value;
        // getter and setter

        }


    @Component
    public interface ConfigurationRepo extends JpaRepository<Configuration, Long> {

    }



  public final class ConfigurationUtil {
        private ConfigurationUtil() {

        }

        private static List<Configuration> defaultConfiguration;

        /**
         * @return the defaultConfiguration
         */
        public static List<Configuration> getDefaultConfiguration() {
        return defaultConfiguration;
        }

        /**
         * @param defaultConfiguration the defaultConfiguration to set
         */
        public static void setDefaultConfiguration(List<Configuration> defaultConfiguration) {
        ConfigurationUtil.defaultConfiguration = defaultConfiguration;
        }

        public static String getValueByField(String field) {
        return defaultConfiguration.stream()
            .filter(s -> s.getField()
                .equalsIgnoreCase(field))
            .findFirst()
            .get()
            .getValue();
        }



    }

    @Component
    public class ConfigurationContextInitializer {

        @Autowired
        ConfigurationRepo configurationRepo;



        @PostConstruct
        public void init() {
        ConfigurationUtil.setDefaultConfiguration(configurationRepo.findAll()); 


        }
    }

//To access DB value
ConfigurationUtil.getValueByField("JOB_NAME"); // depends on your DB key
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...