2016-05-19 7 views
5

मैं स्प्रिंट बूट 1.3, वसंत 4.2अनुसूची क्रॉन के साथ एक कार्य जो गतिशील अद्यतन

का उपयोग इस वर्ग

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

मैं processPayment हर एक्स पल कॉल करना चाहते हैं में अनुमति देता है।

यह एक्स पल डेटाबेस में सेट है। उपयोगकर्ता इसे संशोधित कर सकता है।

तो मुझे लगता है कि मैं एनोटेशन का उपयोग नहीं कर सकता।

मैं इस इस

@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; 
    } 

शुरू कर दिया हो सकता है कि यह अच्छा तरीका नहीं है।

कोई सुझाव?

अगर मेरे संदर्भ पाने के लिए अगर मैं सवाल को देखते हुए मुख्य

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

उत्तर

7

में

@Autowired 
ConfigurableApplicationContext context; 

की तरह और बाद में एक संपत्ति बनाने की जरूरत नहीं जानते लगता है कि आप की तरह अपडेट करना चाहते हैं शेड्यूलर, पुनरारंभ किए बिना।

आपके द्वारा साझा किया गया कोड केवल यह सुनिश्चित करता है कि कॉन्फ़िगरेशन डीबी से लिया गया हो, लेकिन यह एप्लिकेशन को पुनरारंभ किए बिना रीफ्रेश नहीं करेगा।

निम्नलिखित कोड वसंत संदर्भ में डिफ़ॉल्ट अनुसूचक उपलब्ध का उपयोग करेगा और गतिशील रूप से डीबी में उपलब्ध क्रॉन सेटिंग के आधार पर अगले निष्पादन समय की गणना:

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

मैं एप्लिकेशन को पुनरारंभ किए बिना परिवर्तन को प्रतिबिंबित करने में सक्षम होने की खोज करता हूं। –

+0

गतिशील क्रॉन रखने के लिए जावा कोड अपडेट किया गया। आशा है कि आप डीबी प्रविष्टि पर पर्याप्त गार्ड डाल दें, ताकि कोई भी इसे गड़बड़ न कर सके। – Shibashis

+1

तंत्र पसंद आया। क्या स्रोत (बाहरी गुण फ़ाइल, डीबी परिवर्तन इत्यादि) में क्रॉन को अपडेट करने का कोई तरीका है? – Divs

संबंधित मुद्दे