大佬教程收集整理的这篇文章主要介绍了如何在java中在午夜重置计数器值?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在 Spring Boot 中编写功能以在一天内生成唯一的序列号/请求计数。为此,我正在创建一个变量并为其赋值,比如 Counter。要为每个请求提供唯一的序列号,如何在 Spring Boot 中使用多线程?是否也必须为此使用数据库表? 如何编写逻辑以每天午夜将此计数器值重置为零?
我认为计数器总是会增加并且这是保证唯一性的方式?
如果是这样,有两个不同的问题:
答案是只要计数器本身“准备好”在多线程环境中工作就没有问题。
您可以将计数器创建为 bean 并将其注入到将成为入口点的控制器中:
@RestController // just to emphasize that its a controller
public class MyController {
private final Counter counter;
public MyController(Counter counter) {
this.counter = counter;
}
@GetMapping
public void foo() {
counter.increase();
}
}
foo
方法可以被多个线程同时调用。
就计数器的实现而言,您可能需要考虑 java.util.concurrent.atomic.AtomicLong
或 AtomicInteger
。这个类可以在多线程环境中工作。或者,您可以选择带锁的自定义类。
关键是只要计数器本身被设计为从不同的线程同时调用就可以做到。
这可以通过对 spring 的调度支持来完成:
创建一个每午夜运行的作业,注入计数器并添加一个将在午夜运行并重置计数器的 @Scheduled
方法。
@Component
public class MyCounterReseter {
@Autowired
private Counter counter;
@Scheduled("0 0 * * *") // I haven't tested it but you get the idea
public void resetCounter() {
counter.reset(); // or call any other method depending on the actual counter implementation you'll choose
}
}
不要忘记注释 @EnableScheduling
,以便 Spring 处理 @Scheduled
注释
一般来说,以 this tutorial 为例,了解有关 spring 调度支持的更多信息。当然还有很多其他教程。
以上是大佬教程为你收集整理的如何在java中在午夜重置计数器值?全部内容,希望文章能够帮你解决如何在java中在午夜重置计数器值?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。