在java中如何在午夜重置计数器值?

fdx2calv  于 2021-07-22  发布在  Java
关注(0)|答案(1)|浏览(365)

**结束。**此问题需要详细的调试信息。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。

上个月关门了。
改进这个问题
我正在springboot中编写一个函数,以在一天内生成一个唯一的序列号/请求计数。为此,我正在创建一个变量,并为其赋值,比如说计数器。为了给每个请求提供一个唯一的序列号,我如何在springboot中使用多线程?为此使用数据库表也是强制性的吗?我怎样才能写逻辑在每天午夜将这个计数器值重置为零?

35g0bw71

35g0bw711#

我假设计数器总是增加的,这就是保证唯一性的方法?
如果是,有两个不同的问题:
如何在多线程环境中使用计数器?
答案是,只要计数器本身“准备好”在多线程环境中工作,就没有问题。
您可以创建一个作为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 所以 @Scheduled 注解将由spring处理
一般来说,以本教程为例,了解有关spring中的调度支持的更多信息。当然还有很多其他的教程。

相关问题