我如何区分 java 中相同功能的预定调用和 HTTP 调用?

how can i differentiate between scheduled call and HTTP call of the same function in java?

我的微服务中有一个 get 函数,它本质上是从数据库中获取数据。此功能 运行 作为调度程序(cron 作业),也作为 api 端点,可以从 UI.

触发
@GetMapping(value = "getDataUI")
public String getDataUI() throws Exception {
  return service.getData(); // call to service layer
}
//service layer

@Scheduled(cron = "0 0 8 * * ?")
public String getData(){
// logic here //
}

我想在 getData() 中添加一些逻辑,只有当它被调度程序触发时才会执行,当从 UI ("/getDataUI").

我该怎么做?还是有更好的方法来实现我正在尝试做的事情?

请注意,使用 @Scheduled 注释方法需要遵循的简单规则是:

  • 该方法通常应具有 void return 类型(否则,returned 值将被忽略)
  • 该方法不应期望任何参数

解决方案1.创建两个单独的方法

保持简单:

public class DataService implements Service {

    public String getData() {
        return "Data";
    }

    @Scheduled(cron = "0 0 8 * * ?")
    public void performScheduler() {
        /*scheduler logic*/
        String data = getData();
        /* process data */
    }
}

解决方案 2. 为调度程序创建单独的服务

public class SchedulerDataService {
    
    private Service service;

    public SchedulerDataService(Service service) {
        this.service = service;
    }

    @Scheduled(cron = "0 0 8 * * ?")
    public void performScheduler() {
        /*scheduler logic*/
        String data = service.getData();
        /* process data */
    }
}

可以通过以下方式实现

  • cron作业和服务方法的重构
  • Cron Job 可以有包装器方法来调用服务方法。
  • 在服务方法中添加参数

在上面的例子中:

1.Same 如上 getDataUI

 @GetMapping(value = "getDataUI")
   public String getDataUI() throws Exception {

    --
      return service.getData("UI"); // call to service layer
    }
  1. 从服务层删除了计划注释

    //服务层

     public String getData(String param){
        if(param=="CRON")
           //
        else 
         //
     }
    
  2. 安排任务

     @Scheduled(cron = "0 0 8 * * ?")
     public String getScheduleData(){
      //service.getData("CRON");
    
     }