Producers or consumers may be closed after the client exits out of scope

Đang mở
#399 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
35/100
Loại issue
Lỗi
Độ rõ ràng
Khá rõ ràng
Mức độ hoạt động
Đình trệ
Công nghệ
javascript, node.js

Hướng nghiên cứu

Không có tệp mã nguồn hoặc bài kiểm thử nào được nêu tên. Hãy bắt đầu bằng cách chạy tái hiện với một broker Pulsar cục bộ, sau đó lần theo cách quản lý vòng đời của producer, consumer và client trong Node.js client; được xem là hoàn tất khi một producer hoặc consumer vẫn giữ cho client của nó có thể sử dụng được sau khi phạm vi của hàm bên ngoài kết thúc và một regression test ngăn AlreadyClosed xảy ra trong quá trình tiếp tục gửi.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

Here is the reproduction code:

const Pulsar = require('pulsar-client');

(async () => {
  // Create a client
  const client = new Pulsar.Client({
    serviceUrl: 'pulsar://localhost:6650'
  });

  // Create a producer
  const producer = await client.createProducer({
    topic: 'persistent://public/default/my-topic',
  });
  
  const sendRecords = async () => {
    // Send a message
    await producer.send({
        data: Buffer.from("hello")
    });

    console.log("sent hello")
    setTimeout(()=>sendRecords(), 1000)
  }

  
  await sendRecords();
})();

The output would be like:

➜  node node index.js
sent hello
sent hello
sent hello
sent hello
sent hello
sent hello
sent hello
node:internal/process/promises:288
            triggerUncaughtException(err, true /* fromPromise */);
            ^

[Error: Failed to send message: AlreadyClosed]

Node.js v18.19.0

After the client exits the outer function's scope, it will eventually be garbage collected. This closes the producers and causes the AlreadyClosed issue.

A workaround is to pass the client ref to the sendRecords function:

  const sendRecords = async (client) => {
    // Send a message
    await producer.send({
        data: Buffer.from("hello")
    });

    console.log("sent hello")
    setTimeout(()=>sendRecords(client), 1000)
  }

  
  await sendRecords(client);

And it works.

A better approach is to keep a reference to the client inside the producer or consumer. This way, as long as we hold a reference to the producer or consumer, the client object will not be garbage collected.

Ngôn ngữ chính
C++
Star
164
Fork
99
Merge trung bình
5 ngày 18 giờ
Pull request đã merge (30 ngày)
2

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của apache/pulsar-client-node

Tất cả issue của apache/pulsar-client-node

Issue tương tự

Thêm issue về C++

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.