Bull: Cannot do job.update when job runs in separate process

Created on 12 Apr 2019  路  4Comments  路  Source: OptimalBits/bull

Description

I have changed the queue processor from a normal process to a separate process and now I cannot update a job anymore.
It throws the following error:
(node:7068) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: job.update is not a function

Minimal, Working Test code to reproduce the issue.

// master.js

const Bull = require('bull');
const queue = new Bull("html_pusher", { redis: { "port": port, "host": "ip", "db": 0, "showFriendlyErrorStack": true, "password": "pwd" } });

const proc = require('./child.js');
queue.process(1, proc);
// child.js
module.exports = proc;

async function proc(job, done) {
  console.log(`HI JOB ${job.id}`);
  console.log(job);
  job.data.foo = 'bar';
  await job.update(job.data);
  return done();
}

when I convert the processor call to a separate process the job.update throws the error

// master.js

const Bull = require('bull');
const queue = new Bull("html_pusher", { redis: { "port": port, "host": "ip", "db": 0, "showFriendlyErrorStack": true, "password": "pwd" } });

queue.process(__dirname + "/child.js");

Bull version

3.4.8

Additional information

This is the content of job when processor is within the master process:

Job {
  opts:
   { attempts: 1,
     delay: 0,
     timestamp: 1555080724183,
     backoff: undefined },
  name: '__default__',
  queue:
   Queue {
     name: 'html_pusher',
     token: '641dc8a5-7722-4015-a464-06c268685617',
     keyPrefix: 'bull',
     clients: [ [Object], [Object], [Object] ],
     _initializing: Promise { undefined },
     handlers: { __default__: [AsyncFunction: bound proc] },
     processing: [ [Object] ],
     retrieving: 0,
     drained: false,
     settings:
      { lockDuration: 30000,
        stalledInterval: 30000,
        maxStalledCount: 1,
        guardInterval: 5000,
        retryProcessDelay: 5000,
        drainDelay: 5,
        backoffStrategies: {},
        lockRenewTime: 15000 },
     _events: { error: [Function] },
     _eventsCount: 1,
     timers: TimerManager { idle: false, listeners: [], timers: [Object] },
     moveUnlockedJobsToWait: [Function: bound ],
     processJob: [Function: bound ],
     getJobFromId: [Function: bound ],
     keys:
      { '': 'bull:html_pusher:',
        active: 'bull:html_pusher:active',
        wait: 'bull:html_pusher:wait',
        waiting: 'bull:html_pusher:waiting',
        paused: 'bull:html_pusher:paused',
        resumed: 'bull:html_pusher:resumed',
        'meta-paused': 'bull:html_pusher:meta-paused',
        id: 'bull:html_pusher:id',
        delayed: 'bull:html_pusher:delayed',
        priority: 'bull:html_pusher:priority',
        'stalled-check': 'bull:html_pusher:stalled-check',
        completed: 'bull:html_pusher:completed',
        failed: 'bull:html_pusher:failed',
        stalled: 'bull:html_pusher:stalled',
        repeat: 'bull:html_pusher:repeat',
        limiter: 'bull:html_pusher:limiter',
        drained: 'bull:html_pusher:drained',
        progress: 'bull:html_pusher:progress' },
     delayedTimestamp: 1.7976931348623157e+308,
     _initializingProcess: Promise { undefined },
     errorRetryTimer: {},
     registeredEvents: { delayed: [Object] },
     guardianTimer:
      Timeout {
        _called: true,
        _idleTimeout: 5000,
        _idlePrev: [Object],
        _idleNext: [Object],
        _idleStart: 30565,
        _onTimeout: [Function],
        _timerArgs: undefined,
        _repeat: 5000,
        _destroyed: false,
        [Symbol(asyncId)]: 116,
        [Symbol(triggerAsyncId)]: 0 },
     moveUnlockedJobsToWaitInterval:
      Timeout {
        _called: true,
        _idleTimeout: 30000,
        _idlePrev: [Object],
        _idleNext: [Object],
        _idleStart: 30650,
        _onTimeout: [Function: bound ],
        _timerArgs: undefined,
        _repeat: 30000,
        _destroyed: false,
        [Symbol(asyncId)]: 135,
        [Symbol(triggerAsyncId)]: 0 } },
  data:
   {
... my data ...
},
  _progress: 0,
  delay: 0,
  timestamp: 1555080724183,
  stacktrace: [],
  returnvalue: null,
  attemptsMade: 0,
  toKey: [Function: wrapper],
  id: '6604614',
  processedOn: 1555080725310,
  failedReason: undefined }

This is the content of job when job runs in a separate process:

{ id: '6604006',
  name: '__default__',
  data:
   { 
.... my data ....
  },
opts: { attempts: 1, delay: 0, timestamp: 1555080466092 },
progress: [Function],
  delay: 0,
  timestamp: 1555080466092,
  attemptsMade: 0,
  stacktrace: [],
  returnvalue: null,
  finishedOn: null,
  processedOn: 1555080467236 }

It seems that when the job is in a separate process some properties are missing.

PRIO 1 bug

Most helpful comment

It is a missing feature. It needs to be implemented I am have a lot on my table right now so I cannot do an ETA right now.

All 4 comments

hi @manast ,
is there a workaround for this issue? do you have time to fix this?

thanks

It is a missing feature. It needs to be implemented I am have a lot on my table right now so I cannot do an ETA right now.

Any update ?

+1 :)

Was this page helpful?
0 / 5 - 0 ratings

Related issues

alolis picture alolis  路  4Comments

weeco picture weeco  路  3Comments

inn0vative1 picture inn0vative1  路  4Comments

PhillippOhlandt picture PhillippOhlandt  路  4Comments

adamsoffer picture adamsoffer  路  4Comments