基于数据库列中的数据传递调用Java方法

基于数据库列中的数据传递调用Java方法,java,database,spring,Java,Database,Spring,假设我们有一个数据库表(一个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()) -> my

假设我们有一个数据库表(一个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)
对于服务呼叫,我们假设我想做如下操作:

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

我想你可能想要的是一个
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
@postersist
@PostRemove
@PreUpdate
@PostLoad


但并没有执行代码的机制,仅仅因为时间在无情地向前推进。如果您想在其他时间进行检查,您仍然需要某种轮询机制或休眠Java线程。

至少向我们提供实体映射和服务调用。@Nikolas更新。您想实现什么?此外,如果不使用“调度”线程,我不知道如何在Java级别实现这一点。但是更重要的是,我们不想使用某种调度?最重要的原因是它不应该基于调度,因为我需要ThisShouldRunnlyWhenDatePass调用尽可能靠近数据库中的endDate-即使是一秒钟的延迟在这里也是一个很大的量。使用ScheduledExecutorService,设置delay=theDateYouWant.getTime()-new Date().getTime()谢谢,但正如您所指出的,这不是我需要的,因为实体不会更改,所以不会触发回调。谢谢你。
public class TimeFiredEvent {
    @PostPersist
    public void checkTriggerTime(TimePassingByTrigger trig) {
       if(trig.getEndDate().before(new Date()) {
         thisShouldRunOnlyWhenDatePasses(trig.getId());
       }
    }

    public void thisShouldRunOnlyWhenDatePasses(Long objectId) {
    }
}