批量定时队列

3 篇文章 0 订阅
该文章展示了一个使用Java实现的批量定时队列处理器,它从队列中取出一定数量的数据进行批量处理。队列基于LinkedBlockingQueue实现,保证线程安全。程序可以按设定的时间间隔处理数据,或者当队列中的数据达到一定数量时立即处理。在多线程环境下,数据可以被并发添加到队列,处理器会根据预设的条件启动和停止。
摘要由CSDN通过智能技术生成

批量定时队列
可以根据设置,从队列中取出n条数据批量处理,不足n条的话等待m秒后处理数据。

package other

import cn.hutool.core.date.DateUtil
import cn.hutool.core.thread.ThreadUtil

import java.util.concurrent.LinkedBlockingQueue
import java.util.concurrent.TimeUnit
import java.util.concurrent.atomic.AtomicInteger

/**
 * 批量定时执行器
 */
class QueueProcessor {
    private LinkedBlockingQueue<String> dataQueue;
    def volatile receiveCount = 0
    def volatile run = false
    int sizePerTime=10
    int intervalSecond=5

    QueueProcessor(int sizePerTime,int intervalSecond) {
        dataQueue = new LinkedBlockingQueue<>();
        this.sizePerTime=sizePerTime
        this.intervalSecond=intervalSecond
    }

    /**
     * 添加数据到队列
     * 支持多线程并发
     * @param data
     */
    void addData(String data) {
        dataQueue.put(data);
    }

    /**
     * 开始
     */
    def startProcess() {
        if (run) {
            return

        }
        run=true
        receiveCount=0
        new Thread({
            // 定期处理数据
            def last = System.currentTimeMillis();
            def list = []
            while (run) {
                def data = dataQueue.poll(2, TimeUnit.SECONDS)
                if (data) {
                    receiveCount++
                    list.add(data)
                }
                if (list.size() >=sizePerTime || (list.size() > 0 && System.currentTimeMillis() - last > intervalSecond*1000)) {
                    println(DateUtil.now())
                    //批量处理数据
                    println(list)
                    list.clear()
                    last = System.currentTimeMillis();
                }
            }
        }).start()

    }
    /**
     * 停止
     */
    def stopProcess(int sendCount){
        while (true) {
            if (this.receiveCount >= sendCount) {
                run = false
                break;
            }
            sleep(500)
        }
    }

    static void main(String[] args) throws Exception {
        QueueProcessor processor = new QueueProcessor(10,5);
        //1.开启处理器
        processor.startProcess()
        def sendCount = new AtomicInteger()
       def fs =  (1..5).collect {thread->
            return ThreadUtil.execAsync {
                for (int i = 0; i < 100; i++) {
                    //2.加数据到处理器
                    processor.addData(thread+"-"+sendCount.incrementAndGet());
                    sleep(10)
                }
                println(thread+"结束")
            }
        }
        fs.each {it.get()}
        println("fs结束")
        //3.关闭处理器
        processor.stopProcess(sendCount.get())
        println("结束")
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Flink中定时查询MySQL可以通过使用定时器(Timer)机制来实现。首先,需要在Flink作业中设置一个定时器,通过TimerService注册一个回调函数,指定需要执行的定时任务。在回调函数中,可以编写查询MySQL的代码,获取所需要的数据。 具体步骤如下: 1. 在Flink主函数中初始化Flink执行环境,创建流式处理作业(StreamExecutionEnvironment)。 2. 连接MySQL数据库,可以使用JDBC连接驱动,通过指定数据库的URL、用户名和密码来建立连接。 3. 设置定时器,可以使用Flink的window或者process函数,在指定的时间间隔内触发定时任务。 4. 在定时任务的回调函数中,编写查询MySQL的代码。可以使用JDBC访问MySQL数据库,执行SQL查询语句,获取所需的数据。 5. 处理查询结果,使用Flink的流式处理函数进行数据转换、过滤、聚合等操作。 6. 将处理后的结果输出到目标地方,例如文件、Kafka消息队列或者其他数据库。 7. 设置定时器的时间间隔,可以根据实际需求设置,例如每隔5分钟查询一次MySQL。 8. 启动Flink作业,等待定时任务触发,执行查询MySQL的操作。 需要注意的是,在查询MySQL过程中,需要考虑MySQL数据库的性能和并发访问的限制,合理使用连接池和批量查询等技术来优化查询性能。 同时,还需要关注Flink作业的并发度和资源配置,避免查询MySQL时出现资源瓶颈或者内存溢出等问题。 总而言之,通过在Java Flink中设置定时器,可以实现定时查询MySQL数据库的功能,从而实时获取所需的数据进行后续的处理和分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值