2016-05-19 11 views
5

tôi sử dụng nước rút khởi động 1.3, mùa xuân 4,2Schedule một nhiệm vụ với Cron cho phép cập nhật động

Trong lớp này

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

Tôi muốn gọi processPayment mỗi x giây phút.

Khoảnh khắc x này được đặt trong cơ sở dữ liệu. Người dùng có thể sửa đổi nó.

Vì vậy, tôi nghĩ rằng tôi không thể sử dụng ký hiệu.

tôi bắt đầu này này

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

Có lẽ nó không phải là cách tốt.

Bất kỳ đề xuất nào?

Không biết nếu để có được bối cảnh của tôi nếu tôi cần phải tạo ra một tài sản như

@Autowired 
ConfigurableApplicationContext context; 

và sau trong chính

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

Trả lời

7

Nhìn vào câu hỏi có vẻ như bạn muốn cập nhật lên lịch, mà không cần khởi động lại.

Mã bạn đã chia sẻ chỉ đảm bảo cấu hình được chọn từ DB, nhưng mã sẽ không làm mới mà không khởi động lại ứng dụng.

Đoạn mã dưới đây sẽ sử dụng lịch trình mặc định có sẵn trong bối cảnh mùa xuân và tự động tính toán thời gian thực hiện tiếp theo dựa trên các thiết lập cron sẵn trong DB:

Đây là đoạn mã mẫu:

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

tôi tìm kiếm để có thể phản ánh thay đổi mà không cần khởi động lại ứng dụng. –

+0

Cập nhật mã java để có cron động. Hy vọng bạn đặt đủ bảo vệ trên mục nhập db, để không ai làm hỏng nó lên. – Shibashis

+1

Thích cơ chế. Chúng ta có cách nào để cập nhật cron khi nguồn (tập tin thuộc tính bên ngoài, thay đổi db, vv) thay đổi không? – Divs

Các vấn đề liên quan