bucket4j使用实例

本文主要演示一下bucket4j的几个使用实例

maven

        <dependency>
            <groupId>com.github.vladimir-bukhtoyarov</groupId>
            <artifactId>bucket4j-core</artifactId>
            <version>4.0.1</version>
        </dependency>

rate limit

    @Test
    public void testRateLimit(){
        // define the limit 1 time per 10 minute
        Bandwidth limit = Bandwidth.simple(1, Duration.ofMinutes(10));
        // construct the bucket
        Bucket bucket = Bucket4j.builder().addLimit(limit).build();
        IntStream.rangeClosed(1,5)
                .forEach(i -> {
                    executor.submit(() -> {
                        if(bucket.tryConsume(1)){
                            LOGGER.info("acquired");
                        }else{
                            LOGGER.info("blocked");
                        }
                    });
                });
    }
  • 这里使用simple方法构造Bandwidth,进而构建bucket实例

scheduler

    @Test
    public void testAsScheduler(){
        // define the limit 100 times per 1 minute
        Bandwidth limit = Bandwidth.simple(5, Duration.ofMinutes(1));
        // construct the bucket
        Bucket bucket = Bucket4j.builder().addLimit(limit).build();

        // do polling in infinite loop
        while (true) {
            // Consume a token from the token bucket.
            // If a token is not available this method will block until the refill adds one to the bucket.
            try {
                bucket.asScheduler().consume(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            LOGGER.info("do remote call");
        }
    }

输出实例

23:14:46.740 [main] INFO com.example.demo.Bucket4jTest - do remote call
23:14:46.744 [main] INFO com.example.demo.Bucket4jTest - do remote call
23:14:46.744 [main] INFO com.example.demo.Bucket4jTest - do remote call
23:14:46.744 [main] INFO com.example.demo.Bucket4jTest - do remote call
23:14:46.744 [main] INFO com.example.demo.Bucket4jTest - do remote call
23:14:58.749 [main] INFO com.example.demo.Bucket4jTest - do remote call
23:15:10.749 [main] INFO com.example.demo.Bucket4jTest - do remote call
23:15:22.754 [main] INFO com.example.demo.Bucket4jTest - do remote call
23:15:34.757 [main] INFO com.example.demo.Bucket4jTest - do remote call
23:15:46.759 [main] INFO com.example.demo.Bucket4jTest - do remote call
23:15:58.762 [main] INFO com.example.demo.Bucket4jTest - do remote call
23:16:10.765 [main] INFO com.example.demo.Bucket4jTest - do remote call
  • 前面5个token消耗完之后,后续每隔12秒消耗一个token

小结

bucket4j类库是一款优秀的java限流类库,可以用来限流,也可以用作简单调度。

doc

  • Basic usage examples

原文发布于微信公众号 - 码匠的流水账(geek_luandun)

原文发表时间:2018-09-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏LinkedBear的个人空间

设计模式笔记(二)——模板方法模式 原

因为学生3没有抄完(而且抄的题目还写错了。。。),以至于之后要背书的时候怎么也背不对了。。。

772
来自专栏HansBug's Lab

3404: [Usaco2009 Open]Cow Digit Game又见数字游戏

3404: [Usaco2009 Open]Cow Digit Game又见数字游戏 Time Limit: 3 Sec  Memory Limit: 128 ...

2879
来自专栏流媒体

STL算法(排序)简介mergesortrandom_shufflereverse

对指定范围内的元素随机调整次序 srand(time(0)); //设置随机种子

663
来自专栏测试开发架构之路

c++之函数重载(函数匹配)

Case void f(); void f(int); void f(int, int); void f(double, double = 3.14); 匹配原...

3105
来自专栏烂笔头

Python标准库笔记(3) — datetime模块

目录[-] datetime模块提供了简单和复杂的方式用于操纵日期和时间的类。虽然支持日期和时间运算,但实现的重点是为了输出格式化和操作高效地提取属性。 ...

3876
来自专栏C语言及其他语言

[每日一题]大、小写问题

题目描述 输入一串字符,将其中的大写变成小写,若不为大写则原样输出 输入 任意字符串(长度在100以内)以回车表示输入结束 输出 将其中的大写 输出相应的小写,...

2956
来自专栏Ryan Miao

Java中Optional使用注意事项

前言 之前遇到过使用Optional之后带来的隐含bug,现在强调记录一下不好的用法,防止错用。 Optional不能序列化,不能作为类的字段(field) ...

39817
来自专栏流媒体

STL算法(拷贝/替换)简介copyreplacereplace_ifswap

1064
来自专栏一个会写诗的程序员的博客

《Kotlin 程序设计》第五章 Kotlin 面向对象编程(OOP)第五章 Kotlin 面向对象编程(OOP)1. 面向对象的HelloWorld 2. 面向对象编程思想简述3.Kotlin 面向

Kotlin 同Java、 Scala、Groovy 一样,都使用关键字class 来定义类。

1403
来自专栏我就是马云飞

从 Java 到 Kotlin,再从 Kotlin 回归 Java

1541

扫码关注云+社区

领取腾讯云代金券