java队列使用

87 阅读2分钟

队列

队列经常会使用到,原理其实就是和我们常用的类似,常见的java消息中间件队列 ActiveMQRabbitMQZeroMQkafka ,这些消息队列中间件都是需要单独进行部署服务的。

场景

在工作中并不是每个项目都很大,也有很小的项目,比如我现在做的一个小项目,整个项目功能就是每一秒请求一个接口拿到对应的数据,然后把对应的数据组装好插入到数据库当中。
这里一开始的思路是直接请求对应的接口,然后拿到对应的数据,然后通过多线程进行组装,最后插入到数据库当中。
但是出现一个问题,问题就是当上一秒请求的接口没有结束的时候下一秒是不会进行请求的,因为请求的时候也是多线程的,其中一个线程没有拿到数据其它的线程都会进行等待,就会造成部分的数据缺失情况。
这个时候就想到了使用队列进行解耦,把请求的接口和组装的接口分开,但是项目太小了不想引入 kafka ,所以使用到了java自带的队列。

java队列使用

首先是拿到数据之后把对应的数据插入到队列当中,以供后续消费使用

public static Queue<Map<String,DataInfo>> queue = new LinkedList<>();
public void addArr(){
    // 获取到的数据
    DataInfo dataInfo = new DataInfo();
    // 添加到队列当中
    queue.add(LocalDateTime.now(),dataInfo);
}

插入好数据之后就需要进行消费了,这里直接是在 Spring boot 服务启动的时候开启循环,每一秒钟循环一次,每次通过 poll 方法拿到最新的一条数据,然后进行组装这个方法,最后插入到数据库当中,大致代码如下:

@Scheduled(cron = "(0/1 * * * * ? ")
public void pollArr(){
    Map<String, DataInfo> poll = queue.poll();
    // 处理 poll 中的数据
    // 处理后的数据插入到数据库中
}