Comment déclencher une prévue Spring Batch Job?
Je veux être en mesure de commencer mon travail avec un RESTE de contrôleur, puis quand le travail est commencé, il devrait fonctionner sur une base régulière, jusqu'à ce que je l'arrêter de nouveau avec le RESTE.
Donc c'est mon Contrôleur:
@RestController
public class LauncherController {
@Autowired
JobLauncher jobLauncher;
@Autowired
Job job;
@RequestMapping("/launch")
public String launch() throws Exception {
...
jobLauncher.run(job, jobParameters);
}
C'est une partie du Lot conf:
@Configuration
@EnableBatchProcessing
@EnableScheduling
public class BatchConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Scheduled(cron = "0/5 * * * * ?")
@Bean
public Job job() {
return jobBuilderFactory.get("job")
.incrementer(new RunIdIncrementer())
.flow(step1())
.end()
.build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.<Person, Person> chunk(10)
.reader(reader())
.processor(processor())
.writer(writer())
.build();
}
J'ai également définir la propriété printemps.lot.travail.activé=false, puisque je ne veux pas l'exécution des travaux dès le Printemps de Démarrage Application démarre.
Maintenant, je peux appeler mon api Rest de la lauch, et l'exécution du travail, mais seulement une fois. Programmateur ne fonctionne pas. Et je ne pouvais pas comprendre qu'il est de notre exactement où je dois définir mon @Prévue Annotation..
.., qui devrait alors fonctionner à nouveau et à nouveau basé sur mon planificateur de notation.
ok, j'ai créé une application il y a quelques temps à l'aide de quartz de planification des travaux à l'extérieur. Si j'ai le temps, je vais partager le code comme une réponse.
je ne pense pas que nous avons besoin de quartz.. je voudrais juste savoir où/comment je dois définir mon @Prévue annotation. voir: stackoverflow.com/questions/4385719/...
OriginalL'auteur akcasoy | 2017-10-27
Vous devez vous connecter pour publier un commentaire.
Je l'approche il de manière à ce que la tâche planifiée s'exécute toujours, mais c'est uniquement lorsque l'indicateur est défini à true:
et un contrôleur:
Après l'ajout des annotations EnableScheduling et EnableAsync, la méthode execute est en cours d'exécution sur la base de la rate, et le basculement fonctionne aussi. Je vous donnerai de la manne. Mais pourriez-vous svp m'éclairer un peu plus? Je suis en train de commencer à penser que je n'ai pas besoin d'un lot.. c'est juste un composant, et il fonctionne sur une base régulière. Quels sont les autres avantages d'un lot?
il semble que, il fonctionne aussi sans enableAsync.. EnableScheduling est un must.
Vous avez besoin du lot si vous de traiter une grande quantité de données et vous avez besoin de: la gestion des Transactions, Morceau traitement à base Déclarative I/O, Start/Stop/Restart, Réessayer/Skip, basée sur le Web interface d'administration. Si vous voulez juste avoir un travail qui s'exécute toutes les X ou sur un cron base,
@Scheduled
annotation fait le travail.ok merci à vous. je vais encore attendre un peu plus d'une réponse, qui comprend un spring batch de mise en œuvre
OriginalL'auteur Maciej Walkowiak
Dans la première définition de l'emploi:
Dans le deuxième vous êtes en train de lancer l'exécution de ce travail:
À noter également que la "launchTime" paramètre est introduit: par défaut, spring batch, c'est de prévenir le lancement de l'emploi avec les mêmes valeurs de paramètre.
Pendant que votre calendrier est très serré - toutes les 5 secondes, vous devez être conscient de la concurrence. Ou si vous voulez être assuré qu'à chaque instant 1 seule instance de l'exécution de la tâche, vous pouvez configurer unique personnalisé filetée travail lanceur:
Et utiliser ce thread simple d'emploi lanceur pendant le temps de lancement.
Avec cette votre les instances de travail seront exécutées une par une (mais cela ne veut pas les limites de l'exécution en parallèle des étapes à l'intérieur de votre travail).
cette installation sera exécuté par cron directement. Si vous avez besoin d'ajouter un contrôle basé sur le web au cours de l'exécution, de sorte que la réponse de Maciej Walkowiak fera l'affaire. Si vous avez besoin de plus de commencer la tâche ad-hoc, vous pouvez fournir un site web de point de terminaison, ce qui déclenche le lancement() la méthode, puis ad-hoc demande d'aller dans la file d'attente d'exécution, et si il y a de l'espace au moment de lancer le travail.
OriginalL'auteur Ilya Dyoshin
Dans cette solution, vous serez en mesure de programmer et déprogrammer pré emplois définis à l'aide de requêtes http. Dans cet exemple, nous allons créer une base quotidienne, hebdomadaire et ponctuelle à l'Emploi. La demande est à l'aide de
Quartz
.Nous devons d'abord créer un
AutowiringSpringBeanJobFactory
classe étendSpringBeanJobFactory
.La deuxième partie consiste à configurer le quartz de configuration. Dans cette configuration, nous avons besoin de créer un
SchedulerFactoryBean
où nous nous sommes fixé global configuration et l'application de contexte,JobDetailFactoryBean
où nous avons établi notre métier, le jobGroup et de la classe,CronTriggerFactoryBean
où nous avons établi l'expression cron.QuartzConfig.class
Donc, après la config est fait, nous sommes maintenant en mesure de créer nos emplois où la logique commerciale sera placé. Pour cela, nous devons créer une classe qui implémente
Job
.La
DailyJob
classe est maintenant prêt à obtenir prévue. Nous voulons organiser ce travail à partir de l'extérieur via une requête http. Dans cet exemple, nous avons un contrôleur de laquelle nous pouvons envoyer le jobname et l'expression cron à l'annexe de l'dailyJob
.Ce que nous voyons ici, c'est que nous allons envoyer une requête post avec un
JobModel
comme@RequestBody
.JobModel
est un simple Pojo avec deux attributsname
etcronExpression
les deux Chaînes.Dans cette méthode, nous devons créer les haricots instances qui nous avons configuré précédemment dans notre config de classe. D'abord créer
JobDetail
avec QuartzJobDetail.class
, le nom de votre travail, le nom du groupe et de la Classe qui doit être planifié (dans ce casDailyJob.class
). Après cela, nous devons créer le Déclencheur à QuartzTrigger.class
, le cronExpression et le nom du groupe.Après deux haricots sont créées, il faut planifier le travail maintenant. Nous avons donc autocâblés Quartz
Scheduler
pour planifier le travail. Après que le travail est activé et prêt à faire son travail.Donc, nous allons tester le truc. Démarrez l'application et envoyer une requête post à
/job/create/daily
:Ici, nous disons que le travail doit être exécuté à chaque minute (juste pour voir que tout fonctionne). Dans votre console, vous devriez voir chaque minute
Daily Job runs!
.Et voici quelques autres choses que vous pouvez faire. Par exemple, une liste des tâches planifiées:
Pour supprimer une tâche, vous pouvez créer des points de terminaison, trop. Par exemple:
Vous êtes libre de créer de nombreux différents paramètres pour obtenir des informations sur actuellement des travaux en cours d'exécution, combien de fois les travaux étaient en cours d'exécution, reporter des emplois et ainsi de suite. L'Important est juste, que votre jobname et la jobgroup( dans notre cas
"MyDailyJob"
) sont réutilisables. Ces informations sont nécessaires pour créer la jobKey.P. S.: Juste pour montrer à l'autre des correspondances pour les autres emplois:
De la demande complète sur github
Je dirais, dans un cluster, le Quartz travail config devraient être stockées dans la base de données. Si les applications partagent le même DB, il serait possible. Je pense que le Printemps apporte également des fonctionnalités de partage de contexte/config entre les applications.
OriginalL'auteur Patrick
@Scheduled
est définie sur une méthode et non pas sur un Haricot. Donc créer une nouvelle Classe qui sera un Haricotnouvelle Classe:
J'ai essayé une solution pour les deux dernières heures... et cette réponse a beaucoup de côtés, je ne comprends pas. 1. Comment fonctionne un vide de retour de méthode de travail? 2. Il doit être en fait la plupart du temps, votre BatchConfiguration classe où vous injecter votre jobBuilder et stepBuilder Usines. Pas le travail lui-même. Ou? 3. Comment est le travail créé? En utilisant le constructeur ou l'usine? J'ai en quelque sorte, n'arrivent pas à obtenir ce exemple la course.. pouvez-vous s'il vous plaît fournir le code complet?
pour l'instant fixe 1
OriginalL'auteur user7294900