【问题标题】:Call Java method based on date passing in database column根据数据库列中传递的日期调用Java方法
【发布时间】:2018-07-02 17:58:12
【问题描述】:

假设我们有一个数据库表(一个 JPA 实体),创建如下

id|start_date         |end_date           |object_id
1 |2018-01-01 00:00:00|2018-07-01 20:00:00|1

我想在 end_date 通过 current_date() 时运行一个特定的方法 - 我希望 Spring/Java/DB 启动该方法,而不使用调度程序。下面是一些伪代码:

when (end_date <= current_date()) -> myClass.executeMyMethod(object_id)

这甚至可能吗?我搜索了很多不同的网站,但还没有找到答案。

编辑 - 这是一个我想要这样做的实体:

@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "time_based_event", schema = "timing")
public class TimePassingByTrigger {

    @Column(name = "id", nullable = false)
    protected Long id;

    @Column(name = "start_date", nullable = false)
    protected LocalDateTime startDate;

    @Column(name = "endDate", nullable = false)
    protected LocalDateTime endDate; 

    @Column(name = "object_id", nullable = false)
    protected Long objectId; 

}

对于服务调用 - 假设我想做类似的事情:

public class TimeFiredEvent {

    // this method should be executed for each objectId for
    // which end_date has passed
    public void thisShouldRunOnlyWhenDatePasses(Long objectId) {
        System.out.println("Time has passed for object: " + objectId);
    }
}

【问题讨论】:

  • 至少为我们提供实体映射和服务调用。
  • @Nikolas 已更新。
  • 你想达到什么目的?此外,如果不使用“预定”线程,我看不出这将如何在 Java 级别完成。更重要的是,我们不想使用某种调度方式吗?
  • 它不应该基于调度的最重要原因是我需要 thisShouldRunOnlyWhenDatePasses 调用尽可能接近数据库中的 endDate - 即使一秒钟的延迟在这里也很重要。
  • 使用ScheduledExecutorService,设置延迟= theDateYouWant.getTime() - new Date().getTime()

标签: java database spring


【解决方案1】:

我想你可能想要EntityListener

@Table(name="time_based_event", schema="timing")
@EntityListeners(class=TimeFiredEvent.class)
public class TimePassingByTrigger {
....

然后你定义实际的监听器

public class TimeFiredEvent {
    @PostPersist
    public void checkTriggerTime(TimePassingByTrigger trig) {
       if(trig.getEndDate().before(new Date()) {
         thisShouldRunOnlyWhenDatePasses(trig.getId());
       }
    }

    public void thisShouldRunOnlyWhenDatePasses(Long objectId) {
    }
}

但是,这可能不是您真正需要的。 EntityListener 只会在实体被保存、检索或删除时执行。 (有效回调点为@PrePersist@PreRemove@PostPersist@PostRemove@PreUpdate@PostUpdate@PostLoad

但是,没有任何机制可以仅仅因为时间继续它不可阻挡的前进而执行代码。如果您想在其他时间进行检查,您仍然需要某种轮询机制或休眠的 Java 线程。

【讨论】:

  • 谢谢,但正如你所指出的 - 这不是我需要的,因为实体不会改变,所以不会触发回调。无论如何,谢谢。
猜你喜欢
  • 2020-04-25
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 2020-06-15
  • 1970-01-01
相关资源
最近更新 更多