Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Job lifecycle always leads to onFailed event (instead of onSuccess)? #83

Open
adbalits opened this issue Oct 11, 2021 · 2 comments
Open

Comments

@adbalits
Copy link

Hello, great library, but I've been working on getting an example running inside my App.tsx and I've noticed that for some reason my "exampleJob" will always end with the onFailed event rather than onSuccess.

Here's the code...

// inside App.tsx...
let [queue,setQueue] = useState<any>(null);
let [queueReady,setQueueReady] = useState(false);

const initQueue = async () => {
    if(queue){
        //
        // Queue has already been created, just make sure it's running.
        //
        queue.start();
        return;
    }

    //
    // Create the queue.
    //
    let q = await queueFactory();

    //
    // Add worker for exampleJob.
    //
    let jobName = "exampleJob";
    const handleJob = async (id, payload) => {
        console.log(`QueueService::${jobName}Worker::ENTER`, {id, payload});
        // do nothing for now
        console.log(`QueueService::${jobName}Worker::EXIT`, {id, payload});
    };
    let workerOptions: WorkerOptions = {
        onComplete: async (id, payload) => {
            console.log(`App::Queue::${jobName}::onComplete::${Date.now()}`, {id,payload});
        },
        onFailed: async (id, payload) => {
            console.log(`App::Queue::${jobName}::onFailed::${Date.now()}`, {id,payload});
        },
        onSuccess: async (id, payload) => {
            console.log(`App::Queue::${jobName}::onSuccess::${Date.now()}`, {id,payload});
        },
        onStart: async (id, payload) => {
            console.log(`App::Queue::${jobName}::onStart::${Date.now()}`, {id,payload});
        },
    };
    q.addWorker(jobName, handleJob, workerOptions);

    //
    // Start the queue and setState.
    // 
    q.start();
    setQueue(q);
    setQueueReady(true);
};

/**
 * Boot the queue.
 */
useEffect(() => {
    initQueue();
},[]);

/**
 * Run an exampleJob when the queue is ready.
 */
 useEffect(() => {
    if(!queueReady){
        // queue not ready, do not proceed
        return;
    }

    //
    // create job
    //
    let jobName = "exampleJob";
    let jobData = {
        emailAddress: '[email protected]',
        randomData: {
            random: 'object',
            of: 'arbitrary data'
        }
    };
    let jobOpts: JobOptions = {
        attempts: 1,
    };
    queue.createJob(jobName, jobData, jobOpts, true);
}, [queueReady]);

And here's the output...

App::Queue::sendCookie::onStart::1633993068497 {id: "79bdd77e-ea42-4c4b-8b78-f80cda245c07", payload: {…}}
App.tsx:92 QueueService::exampleJobWorker::ENTER {id: "79bdd77e-ea42-4c4b-8b78-f80cda245c07", payload: {…}}
App.tsx:93 QueueService::exampleJobWorker::EXIT {id: "79bdd77e-ea42-4c4b-8b78-f80cda245c07", payload: {…}}
App.tsx:81 App::Queue::sendCookie::onFailed::1633993068502 {id: "79bdd77e-ea42-4c4b-8b78-f80cda245c07", payload: {…}}
App.tsx:78 App::Queue::sendCookie::onComplete::1633993068502 {id: "79bdd77e-ea42-4c4b-8b78-f80cda245c07", payload: {…}}

I've tried to figure out what leads to onFailed vs onSuccess but I haven't had any luck. Appreciate any advice.

@adbalits adbalits changed the title Job lifecycle always leads to onFailed event? Job lifecycle always leads to onFailed event (instead of onSuccess)? Oct 11, 2021
@adbalits
Copy link
Author

I have done some investigation. The reason the job triggers the onFailed lifecycle event is because this error gets triggered during execution of the job:

TypeError: Cannot read property 'ok' of undefined
    at Queue._callee5$ (Queue.js:329)
    at tryCatch (runtime.js:63)
    at Generator.invoke [as _invoke] (runtime.js:294)
    at Generator.next (runtime.js:119)
    at fulfilled (Queue.js:10)
    at tryCallOne (core.js:37)
    at core.js:123
    at JSTimers.js:270
    at _callTimer (JSTimers.js:123)
    at _callImmediatesPass (JSTimers.js:177)

Still looking into why that happens.

@adbalits
Copy link
Author

adbalits commented Oct 12, 2021

Update: it was this line in the processJob function of Queue.js that caused the runtime error which led to the onFailed event...

if (!executionResult.ok) throw new Error('Execution failure'); // here we catch http errors

I modified my job handler to do the following:

const handleJob = async (id, payload) => {
        console.log(`QueueService::${jobName}Worker::ENTER`, {id, payload});
        // do nothing for now
        console.log(`QueueService::${jobName}Worker::EXIT`, {id, payload});
        return {ok:true};
    };

And now the onSuccess lifecycle event gets triggered instead of onFailed.

I will leave the issue open because this should really be explained in the README.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant