2016-05-19 4 views
5

dynamischem Update ermöglicht ich Sprint-Boot 1.3, Feder 4.2Zeitplan eine Aufgabe mit Cron der

In dieser Klasse

@Service 
public class PaymentServiceImpl implements PaymentService { 
    .... 
    @Transactional 
    @Override 
    public void processPayment() { 
     List<Payment> payments = paymentRepository.findDuePayment(); 
     processCreditCardPayment(payments); 
    } 
} 

Ich mag processPayment jeden x Moment nennen.

Dieser x Moment wird in einer Datenbank festgelegt. Der Benutzer kann es ändern.

Also ich denke, ich kann keine Anotation verwenden.

begann ich zu diesem diesem

@EntityScan(basePackageClasses = {MyApp.class,  Jsr310JpaConverters.class}) 
@SpringBootApplication 
@EnableCaching 
@EnableScheduling 
public class MyApp { 

    @Autowired 
    private DefaultConfigService defaultConfigService; 

    public static void main(String[] args) { 
     SpringApplication.run(MyApp.class, args); 
    } 

    @Bean 
    public TaskScheduler poolScheduler() { 
     SimpleAsyncTaskExecutor taskScheduler = new SimpleAsyncTaskExecutor(); 

     DefaultConfigDto defaultConfigDto = defaultConfigService.getByFieldName("payment-cron-task"); 
     String cronTabExpression = "0 0 4 * * ?"; 
     if (defaultConfigDto != null && !defaultConfigDto.getFieldValue().isEmpty()) { 
      cronTabExpression = "0 0 4 * * ?"; 
     } 

     appContext.getBean("scheduler"); 

     taskScheduler.schedule(task, new CronTrigger(cronTabExpression)); 
     return scheduler; 
    } 

es ist nicht der gute Weg Vielleicht.

Irgendwelche Vorschläge?

Weiß nicht, ob mein Kontext zu bekommen, wenn ich scheint eine Eigenschaft wie

@Autowired 
ConfigurableApplicationContext context; 

und nach in der Haupt

public static void main(String[] args) { 
     context = SpringApplication.run(MyApp.class, args); 
} 

Antwort

7

Mit Blick auf die Frage erstellen müssen, wie Sie aktualisieren möchten der Scheduler, ohne Neustart.

Der Code, den Sie freigegeben haben, stellt nur sicher, dass die Konfiguration aus der DB ausgewählt wird, aber sie wird nicht ohne Neustart der Anwendung aktualisiert.

Der folgende Code wird die Standard-Scheduler im Frühjahr Kontext verfügbar verwenden und dynamisch die nächste Ausführungszeit auf der verfügbaren Cron Einstellung im DB basierte berechnen:

Hier ist der Beispielcode:

import java.util.Date; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.scheduling.Trigger; 
import org.springframework.scheduling.TriggerContext; 
import org.springframework.scheduling.annotation.EnableScheduling; 
import org.springframework.scheduling.annotation.SchedulingConfigurer; 
import org.springframework.scheduling.config.ScheduledTaskRegistrar; 
import org.springframework.scheduling.support.CronTrigger; 

@SpringBootApplication 
@EnableScheduling 
public class Perses implements SchedulingConfigurer { 
    private static final Logger log = LoggerFactory.getLogger(Perses.class); 

    @Autowired 
    private DefaultConfigService defaultConfigService; 

    @Autowired 
    private PaymentService paymentService; 

    public static void main(String[] args) { 
     SpringApplication.run(Perses.class, args); 
    } 

    private String cronConfig() { 
     String cronTabExpression = "*/5 * * * * *"; 
     if (defaultConfigDto != null && !defaultConfigDto.getFieldValue().isEmpty()) { 
      cronTabExpression = "0 0 4 * * ?"; 
     } 
     return cronTabExpression; 
    } 

    @Override 
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { 
     taskRegistrar.addTriggerTask(new Runnable() { 
      @Override 
      public void run() { 
       paymentService.processPayment(); 
      } 
     }, new Trigger() { 
      @Override 
      public Date nextExecutionTime(TriggerContext triggerContext) { 
       String cron = cronConfig(); 
       log.info(cron); 
       CronTrigger trigger = new CronTrigger(cron); 
       Date nextExec = trigger.nextExecutionTime(triggerContext); 
       return nextExec; 
      } 
     }); 
    } 
} 
+0

Ich suche, um die Änderung dynamisch zu reflektieren, ohne die Anwendung neu zu starten. –

+0

Der Java-Code wurde aktualisiert, um dynamisches Cron zu haben. Ich hoffe, du hast genug Wachen auf den db-Eintrag gesetzt, damit niemand es vermasselt. – Shibashis

+1

Gefiel der Mechanismus. Haben wir irgendeine Möglichkeit, das Cron zu aktualisieren, wenn sich die Quelle (externe Eigenschaftendatei, Datenbankänderungen usw.) ändert? – Divs