首页 > 解决方案 > 强制子类将@Schedule添加到Java Spring中超抽象类中的方法

问题描述

我有一个超级抽象类,它有一些常见的实现方法和其他要由子类实现的抽象方法。一种常见的实现方法是注释为的方法@Scheduled,但我希望子类定义应该如何定义这个计划(固定延迟、固定速率或 cron 等)。如何实施这种行为?

我想到的一种方法是覆盖要在子类中调度的方法,以便它只在超类中调用其相应的方法并在其上添加@Scheduled所需的定义,但我不知道如何强制子类这样做是因为这种方法不是抽象的。

超抽象类

public abstract class SuperClass {
       public abstract void x();
       public void y() { 
              // Some implementation
       } 
    
       // Method to be scheduled. 
       public void scheduledMethod() {
              x();
              y();
       }
}

子类

public class Subclass extends SuperClass {
       @Override
       public void x() { 
              // Some implementation
       }

       // How to enforce the developer to add this ? 
       @Scheduled(cron = "0 0 0 * * ?")
       public void scheduledMethod(){
              super.scheduledMethod();
       } 
}

标签: javaspringspring-bootinheritancespring-scheduled

解决方案


我无法理解如何使用@Scheduled,但是,我有一个替代方案:

  1. 在您的抽象类中,要求子类实现一个方法以返回时间表:
public String getCronString();
  1. 使用在您的子类中实现的方法使用调度程序以编程方式调度任务getCronString(),以返回 cron 调度。关于如何使用 Spring Boot 以编程方式安排任务的几个示例:

基本上,如果您的子类没有实现public String getCronString();您的代码将无法编译。


推荐阅读