You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by "RobertIndie (via GitHub)" <gi...@apache.org> on 2024/10/30 03:25:39 UTC

[I] Producers or consumers may be closed after the client exits out of scope [pulsar-client-node]

RobertIndie opened a new issue, #399:
URL: https://github.com/apache/pulsar-client-node/issues/399

   Here is the reproduction code:
   ```js
   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:
   ```js
     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.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscribe@pulsar.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org