kue icon indicating copy to clipboard operation
kue copied to clipboard

job complete event is missing after pause/resume

Open fbergama opened this issue 7 years ago • 10 comments

Hi everybody.

If I run this code

var concurrency=1
mainq.process('myjob', concurrency, function(job,ctx,done) {

            ctx.pause( 50000, function(err){
                console.log("Worker is paused... ");
                setTimeout( function(){ ctx.resume(); }, 10000 );
            });

            setTimeout( function() { done(); }, 2000 );
});

I correctly receive the "job complete" events when I set the callback listener with mainq.on("job complete', my_complete_callback). However, if I set concurrency to any value greater than 1, my_complete_callback is not always called and some jobs remain stucked in "active" state.

Is it a bug? Did I forget something? Thank you

fbergama avatar May 09 '17 12:05 fbergama

mainq.on("job complete', my_complete_callback). I'm assuming that the " is a typo?

Do you get the same error if you attach a job specific event?

TheGrandmother avatar May 16 '17 13:05 TheGrandmother

mainq.on("job complete', my_complete_callback). I'm assuming that the " is a typo?

Yes, sorry. It's a typo.

Do you get the same error if you attach a job specific event?

Yes, I've tried setting something like:

mainq.create( 'something', {
              ....
            }).on('remove',function(result) {
                console.log("JOB REMOVED");
            }).on('complete',function(result) {
                console.log("JOB COMPLETE");
            }).save

But the "JOB COMPLETE" is not written on the console for all the elements of the queue. Also in this case, with a concurrency=1 everything works as expected

fbergama avatar May 16 '17 13:05 fbergama

Hmm... Just tested this in my code and it works. Although my jobs are actually not being executed concurrently (they contain a blocking loop for testing purposes) but the com completed event gets triggered simultaneously and correctly from the queue.

Make sure that all the string constants in the code are correct. Kue has a tendency just to silently continue when you give it faulty parameters about it, I am going to start working on a PR to try to introduce some more defensive programming into Kue when I know what branch to work against. I just spent a long time in utter confusion and despair until i realized that i had written .on('completed' ... instead of complete and Kue did not give me any indication to this being the case.

So I recommend carefully reading through everything.

TheGrandmother avatar May 16 '17 13:05 TheGrandmother

Make sure that all the string constants in the code are correct.

That must not be the case since everything is working with a 1 job concurrency :(

Anyway, thank you for helping. I'll create a new test script to clearly replicate the problem. If it's working for you maybe It's because I have a different version?

fbergama avatar May 16 '17 14:05 fbergama

Things are indeed strange! I'm running version 0.11.5.

TheGrandmother avatar May 16 '17 14:05 TheGrandmother

Ok same version here. I'll post some testing code here if I cannot solve the issue by myself. I suppose that there must be something odd with my code

fbergama avatar May 16 '17 14:05 fbergama

Best is to send us a replicating code @fbergama

behrad avatar May 18 '17 11:05 behrad

Ok I've created a simple test function:

function testkue( concurrency ) {

    console.log("Testing concurrency=%d", concurrency);

    var kue = require('kue');
    var queue = kue.createQueue();

    queue.on('job enqueue', function(id, type){
        console.log( 'job %s queued', id );

    }).on('job complete', function(id, result){
        console.log('job #%d completed', id);
    });


    queue.process('testtask', concurrency, function(job, ctx, done){

        ctx.pause( 5000, function(err){
            console.log("Worker is paused... ");
            setTimeout( function(){ ctx.resume(); console.log("Worker resumed"); }, 5000 );
        });
        setTimeout( function() { done(); }, 3000 );

    });


    for( var i=0; i<5; ++i ) {
        queue.create( 'testtask', {} ).save();
    }
}

here is the output I get when I invoke testkue(1)

Testing concurrency=1
job 1 queued
job 2 queued
job 3 queued
job 4 queued
job 5 queued
Worker is paused...
job #1 completed
Worker resumed
job #2 completed
Worker is paused...
Worker resumed
job #3 completed
Worker is paused...
Worker resumed
job #4 completed
Worker is paused...
Worker resumed
job #5 completed
Worker is paused...
Worker resumed

As you can see, the complete event is received for all the jobs. On the other hand, if I invoke testkue(2) I obtain the following:

Testing concurrency=2
job 1 queued
job 2 queued
job 3 queued
job 4 queued
job 5 queued
Worker is paused...
Worker resumed
Worker is paused...
Worker is paused...
job #3 completed
Worker resumed
Worker resumed
Worker is paused...
job #4 completed
job #5 completed
Worker is paused...
Worker resumed
Worker resumed

Basically, job 1 and 2 remain stucked in active state and no complete event is received. If I change concurrency to other values other than 1 I still obtain the same kind of error.

Hope that this can help

fbergama avatar May 18 '17 16:05 fbergama

thank you @fbergama , this helps to find and fix the issue

behrad avatar Jun 01 '17 08:06 behrad

Was anyone able to uncover what the underlying issue was for this one? I'm seeing the same thing happening with the current/latest version as well. Trying to debug Kue internals but not as familiar with the Lib just yet. @behrad @fbergama @TheGrandmother

If anyone has any info / fix for this - I'm all ears! 👍 🙏

MarkPieszak avatar Jul 01 '18 00:07 MarkPieszak