java,数据库,定时任务,消息中间件

就是我设置完公示期,存到数据库里面,公示期是存在数据库里,但是公示开始时间还没到,所以现在的状态是待公示,用什么技术可以实现当公示日期开始时,自动设置这条记录状态为公示中呢

img

在保存公示记录时,向消息队列(如RabbitMQ)发送一条延时消息,消息的延时时间设置为公示开始时间
当收到这个消息后 去改变数据库的值 让后在用WebSocket 通知前端

1、看时间情况,可以设置多少秒一次,或者几分钟一次,或者几小时一次的定时任务,去查看变动状态。
2、第二个就是让前端通过时间去判断,用户查看的时候根据时间交给前端去显示状态,这里其实也可以设置成,如果前端有人查看了这个记录,就请求后端数据库去检查,变更状态,比如今天没人查看,就没人关心这个公示时间,明天有人看了,第一个人点进来就请求更新状态
3、也可以用消息中间件,但是你可以去了解下,我知道的rabbimq你设置延时队列,也不能达到定时效果,他还是队列消费
4、就在刚才回答的时候我自己又想到一个办法,感觉可行,就是自己没试过,纯个人想法,而且绝对准时,当设置进来公示时间,根据公式时间设置一个定时任务,等第一个定时任务完成的时候再将这个定时任务删除,这样我感觉也可以
5、还有就是reids,这个还是看个人需要吧
目前我觉得可靠的就是靠定时任务,剩下的我就不知道了,希望其他人也回答一下,都探讨探讨

可以考虑用定时任务去查询,再加上延时任务执行
我看你的公示时间都是到秒的,那么定时任务1分钟1次,距离当前时间有三种情况
1、刚好是当前时间,直接执行修改为公示状态;
2、距离当前时间1分钟之类,创建一个延时任务

 Robot robot = new Robot();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ");
        System.out.println("延时前 :"+dateFormat.format(new Date()));
        robot.delay(2000);
        System.out.println("延时后 :"+dateFormat.format(new Date()));
        
        //延时方法二
        try {
            Thread.sleep(3000);
            System.out.println("Thread延时后 :"+dateFormat.format(new Date()));
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        //延时方法三
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            
            @Override
            public void run() {
                System.out.print("----时间: "+dateFormat.format(new Date()));
                this.cancel();
                
            }
        }, 2000);
        System.out.print("三秒后打印时间:");
        }

3、大于等于1分钟,不作处理
这样数据库压力会小很多,而且实用
如果有用,请给个采纳,谢谢

【以下回答由 GPT 生成】

要实现在公示开始时间时自动将记录状态设置为“公示中”,可以使用以下步骤:

  1. 首先,需要设置一个定时任务。使用Java的定时任务框架,例如Spring的Task Scheduler或Quartz,创建一个定时任务方法,该方法将定时执行任务。
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class PublicityTask {

    @Scheduled(cron = "0 0 0 * * ?") // 每天凌晨执行任务
    public void changeStatusToPublic() {
        // 在这里实现将记录状态设置为“公示中”的逻辑
    }
}
  1. 在任务方法中,需要实现将记录状态设置为“公示中”的逻辑。首先,从数据库中查询所有待公示的记录,根据公示开始时间判断是否需要更改状态。如果需要更改,使用数据库操作语句更新记录的状态为“公示中”。
public void changeStatusToPublic() {
    Date now = new Date();
    List<Record> records = recordRepository.findByStatus("待公示");
    for (Record record : records) {
        if (record.getStartDateTime().compareTo(now) <= 0) {
            record.setStatus("公示中");
            recordRepository.save(record);
        }
    }
}
  1. 要在方法中使用数据库操作语句,需要使用Java的数据库连接库,例如JDBC或者使用ORM框架,例如Hibernate。具体的数据库操作方法可以根据使用的库来确定。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public void changeStatusToPublic() {
    // 建立数据库连接
    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "username", "password");
    // 执行更新语句
    String sql = "UPDATE records SET status = '公示中' WHERE status = '待公示' AND start_date_time <= ?";
    PreparedStatement statement = connection.prepareStatement(sql);
    statement.setTimestamp(1, new Timestamp(System.currentTimeMillis()));
    statement.executeUpdate();
    // 关闭连接
    statement.close();
    connection.close();
}
  1. 最后,任务方法中的逻辑将会周期性地在设定的时间触发执行,自动将符合条件的记录状态设置为“公示中”。

请注意,以上代码片段仅提供参考,具体实现可能因项目架构、框架、数据库等不同而有所调整。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^