breejs / bree

Bree is a Node.js and JavaScript job task scheduler with worker threads, cron, Date, and human syntax. Built for @ladjs, @forwardemail, @spamscanner, @cabinjs.
https://jobscheduler.net
MIT License
2.96k stars 80 forks source link

Bree Workers Won't Follow closeWorkerAfterMs rule #227

Open mhofwell opened 9 months ago

mhofwell commented 9 months ago

Hello,

I am using Bree to execute Cron 1 which ingests data from an API to my DB. Cron 2 then executes and uses DB data to spawn several workers operating Cron 3 with different data for each worker. Cron 3 runs on an infinite loop for each worker, even though it has a closeWorkerAfterMs, process.exit(0) command and the parentPort.postMessage('done').

Cron 2: "cronFactory.js"

` import path from 'path'; import ms from 'ms'; import Bree from 'bree'; import { PrismaClient } from '@prisma/client';

const cronFactory = async () => { const prisma = new PrismaClient();

const fixtures = await prisma.fixtures.findMany();
const appDir =
    '/Users/bigviking/Documents/GitHub/Projects/blackjack/server/';

let newCronJobs = [];

fixtures.forEach((fixture) => {
    newCronJobs.push({
        name: `gw-worker-${fixture.kickoff_time}`,
        path: path.join(appDir + '/jobs', 'updateGoals.js'),
        interval: '1s',
        closeWorkerAfterMs: ms('2s'),
        outputWorkerMetadata: true,
        worker: {
            workerData: {
                kickoff_time: fixture.kickoff_time,
                numberOfFixtures: fixture.number_of_fixtures,
            },
        },
    });
});

console.log(newCronJobs);

const cron = new Bree({
    root: false,
    jobs: newCronJobs,
    closeWorkerAfterMs: ms('2s'),
    errorHandler: (error, workerMetadata) => {
        // workerMetadata will be populated with extended worker information only if
        // Bree instance is initialized with parameter `workerMetadata: true`
        if (workerMetadata.threadId) {
            console.log(
                `There was an error while running a worker ${workerMetadata.name} with thread ID: ${workerMetadata.threadId}`
            );
        } else {
            console.log(
                `There was an error while running a worker ${workerMetadata.name}`
            );
        }
        console.error(error);
        errorService.captureException(error);
    },
});
await cron.start();

};

cronFactory(); `

Cron 3: goalUpdate.js

`import { parentPort, workerData } from 'worker_threads';

const goalUpdate = async () => { if (parentPort) parentPort.postMessage('done'); else process.exit(0); };

goalUpdate();`

The console output runs infinitely, threadID's keep climbing. Help?

Screenshot 2023-10-03 at 2 49 27 PM