11 ArrayBlockingQueue

jdk 基于 8 版本

在平时的开发中,我们可能会用到 ArrayBlockingQueue, 它是基于循环数组来实现的,是并发安全的。

使用方式

1
2
3
4
5
6
7
8
9
public class ArrayBlockingQueueTest {

    @Test
    void test() {
        BlockingQueue<String> queue = new ArrayBlockingQueue<>(10);
        queue.offer("1");
        assertThat(queue.poll()).isEqualTo("1");
    }
}

offer

添加元素,依赖锁来保证并发安全。

Rust Axum 测试类

multipart 测试类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
const BOUNDARY: &str = "BOUNDARY";

#[tokio::test]
async fn test_import_proc_def() -> anyhow::Result<()> {
    let bytes = fs::read("./examples/test01.xml").await?;
    let request = Request::builder()
        .header(
            CONTENT_TYPE,
            format!("multipart/form-data; boundary={}", BOUNDARY),
        )
        .body::<Body>(generate_multipart_data("file", &bytes)?.into())
        .unwrap();
    let multipart = Multipart::from_request(request, &State(())).await?;

    let (db, ..) = setup().await?;
    let proc_def_ids = import_proc_def(State(db), multipart).await?;

    info!("{:?}", proc_def_ids);
    Ok(())
}

fn generate_multipart_data(name: &str, bytes: &[u8]) -> anyhow::Result<Vec<u8>> {
    let mut data = Vec::new();
    write!(data, "--{}\r\n", BOUNDARY)?;
    write!(data, "Content-Disposition: form-data; name=\"{}\";\r\n", name)?;
    write!(data, "\r\n")?;
    std::io::Write::write_all(&mut data, bytes)?;
    write!(data, "\r\n")?;

    write!(data, "--{}--\r\n", BOUNDARY)?;
    Ok(data)
}

Rust Openssl 依赖

在 window 上使用 openssl, 会遇到错误 failed to run custom build command for openssl-sys v0.9.102.

解决方法

  1. 下载 vcpkg, 打开 powershell
  2. 执行 ./bootstrap-vcpkg.bat
  3. 执行 ./vcpkg.exe install openssl:x64-windows-static
  4. 配置环境变量 OPENSSL_DIR=C:\Users\ooooo\Development\Vcpkg\installed\x64-windows-static
  5. 重新启动项目编译

参考

  1. stackoverflow
  2. github

Rust 常用依赖库

介绍常用的依赖库,持续更新

  1. async_trait: 异步支持
  2. once_cell: OnceCellLazy
  3. clap: 命令行支持
  4. axum: http 服务
  5. tokio: 异步运行时
  6. serde: 序列化
  7. serde_json: json 序列化
  8. log: 日志门面
  9. env_logger: 日志实现
  10. anyhow: Result
  11. chrono: 日期和时间
  12. quick-xml: 读写 xml
  13. sqlx: 异步 sql 访问
  14. dotenvy: 支持加载 .env 文件
  15. cargo-watch: 热加载代码,二进制程序
  16. cargo-expand: 展开宏代码,二进制程序
  17. evalexpr: 解析表达式
  18. reqwest: http 客户端
  19. tower: 请求和响应抽象层
  20. tower-http: http 中间件实现

09 ConcurrentHashMap

jdk 基于 8 版本

在平时的开发中,我们经常会用到 ConcurrentHashMap, 是并发安全的。

使用方式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public class ConcurrentHashMapTest {

    @Test
    void test() {
        Map<String, String> map = new ConcurrentHashMap<>();
        map.put("1", "1");
        assertThat(map.get("1")).isEqualTo("1");
        map.remove("1");
        assertThat(map.size()).isEqualTo(0);
    }
}

put

添加元素。