就是我设置完公示期,存到数据库里面,公示期是存在数据库里,但是公示开始时间还没到,所以现在的状态是待公示,用什么技术可以实现当公示日期开始时,自动设置这条记录状态为公示中呢
在保存公示记录时,向消息队列(如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 生成】
要实现在公示开始时间时自动将记录状态设置为“公示中”,可以使用以下步骤:
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class PublicityTask {
@Scheduled(cron = "0 0 0 * * ?") // 每天凌晨执行任务
public void changeStatusToPublic() {
// 在这里实现将记录状态设置为“公示中”的逻辑
}
}
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);
}
}
}
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();
}
请注意,以上代码片段仅提供参考,具体实现可能因项目架构、框架、数据库等不同而有所调整。
【相关推荐】