Example #1
0
 beforeAll(async () => {
   await specHelper.connect()
   await specHelper.cleanup()
   queue = new NodeResque.Queue({connection: specHelper.cleanConnectionDetails(), queue: specHelper.queue}, jobs)
   scheduler = new NodeResque.Scheduler({connection: specHelper.cleanConnectionDetails(), timeout: specHelper.timeout})
   await scheduler.connect()
   scheduler.start()
   await queue.connect()
 })
Example #2
0
 beforeEach(async () => {
   await specHelper.cleanup()
   scheduler = new NodeResque.Scheduler({
     connection: specHelper.connectionDetails,
     timeout: specHelper.timeout,
     stuckWorkerTimeout: 1000
   })
   queue = new NodeResque.Queue({connection: specHelper.connectionDetails, queue: specHelper.queue})
   await scheduler.connect()
   await queue.connect()
 })
Example #3
0
  beforeAll(async () => {
    await specHelper.connect()
    queue = new NodeResque.Queue({connection: specHelper.cleanConnectionDetails(), queue: specHelper.queue})
    await queue.connect()

    multiWorker = new NodeResque.MultiWorker({
      connection: specHelper.cleanConnectionDetails(),
      timeout: specHelper.timeout,
      checkTimeout: checkTimeout,
      minTaskProcessors: minTaskProcessors,
      maxTaskProcessors: maxTaskProcessors,
      queues: [specHelper.queue]
    }, jobs)

    await multiWorker.end()

    multiWorker.on('error', (error) => { throw error })
  })
Example #4
0
async function boot () {
  // ////////////////////////
  // SET UP THE CONNECTION //
  // ////////////////////////

  const connectionDetails = {
    pkg: 'ioredis',
    host: '127.0.0.1',
    password: null,
    port: 6379,
    database: 0
    // namespace: 'resque',
    // looping: true,
    // options: {password: '******'},
  }

  // ///////////////////////////
  // DEFINE YOUR WORKER TASKS //
  // ///////////////////////////

  const jobs = {
    'stuck': {
      perform: async function () {
        console.log(`${this.name} is starting stuck job...`)
        await new Promise((resolve) => {
          clearTimeout(this.pingTimer)// stop the worker from checkin in, like the process crashed
          setTimeout(resolve, 60 * 60 * 1000) // 1 hour job
        })
      }
    }
  }

  // /////////////////
  // START A WORKER //
  // /////////////////

  const worker = new NodeResque.Worker({connection: connectionDetails, queues: ['stuckJobs']}, jobs)
  await worker.connect()
  worker.start()

  // ////////////////////
  // START A SCHEDULER //
  // ////////////////////

  const scheduler = new NodeResque.Scheduler({
    stuckWorkerTimeout: (10 * 1000),
    connection: connectionDetails
  })

  await scheduler.connect()
  scheduler.start()

  // //////////////////////
  // REGESTER FOR EVENTS //
  // //////////////////////

  worker.on('start', () => { console.log('worker started') })
  worker.on('end', () => { console.log('worker ended') })
  worker.on('cleaning_worker', (worker, pid) => { console.log(`cleaning old worker ${worker}`) })
  worker.on('poll', (queue) => { console.log(`worker polling ${queue}`) })
  worker.on('ping', (time) => { console.log(`worker check in @ ${time}`) })
  worker.on('job', (queue, job) => { console.log(`working job ${queue} ${JSON.stringify(job)}`) })
  worker.on('reEnqueue', (queue, job, plugin) => { console.log(`reEnqueue job (${plugin}) ${queue} ${JSON.stringify(job)}`) })
  worker.on('success', (queue, job, result) => { console.log(`job success ${queue} ${JSON.stringify(job)} >> ${result}`) })
  worker.on('failure', (queue, job, failure) => { console.log(`job failure ${queue} ${JSON.stringify(job)} >> ${failure}`) })
  worker.on('error', (error, queue, job) => { console.log(`error ${queue} ${JSON.stringify(job)}  >> ${error}`) })
  worker.on('pause', () => { console.log('worker paused') })

  scheduler.on('start', () => { console.log('scheduler started') })
  scheduler.on('end', () => { console.log('scheduler ended') })
  scheduler.on('poll', () => { console.log('scheduler polling') })
  scheduler.on('master', (state) => { console.log('scheduler became master') })
  scheduler.on('error', (error) => { console.log(`scheduler error >> ${error}`) })
  scheduler.on('workingTimestamp', (timestamp) => { console.log(`scheduler working timestamp ${timestamp}`) })
  scheduler.on('transferredJob', (timestamp, job) => { console.log(`scheduler enquing job ${timestamp} >> ${JSON.stringify(job)}`) })

  scheduler.on('cleanStuckWorker', (workerName, errorPayload, delta) => {
    console.log(`failing ${workerName} (stuck for ${delta}s) and failing job: ${JSON.stringify(errorPayload)}`)
    process.exit()
  })

  // //////////////////////
  // CONNECT TO A QUEUE //
  // //////////////////////

  const queue = new NodeResque.Queue({connection: connectionDetails}, jobs)
  queue.on('error', function (error) { console.log(error) })
  await queue.connect()
  await queue.enqueue('stuckJobs', 'stuck', ['oh no'])
}
Example #5
0
 beforeAll(async () => {
   await specHelper.connect()
   await specHelper.cleanup()
   queue = new NodeResque.Queue({connection: specHelper.cleanConnectionDetails(), queue: specHelper.queue}, jobs)
   await queue.connect()
 })
Example #6
0
async function boot () {
  // //////////////
  // DEFINE JOBS //
  // //////////////

  const blockingSleep = function (naptime) {
    var sleeping = true
    var now = new Date()
    var alarm
    var startingMSeconds = now.getTime()
    while (sleeping) {
      alarm = new Date()
      var alarmMSeconds = alarm.getTime()
      if (alarmMSeconds - startingMSeconds > naptime) { sleeping = false }
    }
  }

  const jobs = {
    'slowSleepJob': {
      plugins: [],
      pluginOptions: {},
      perform: async () => {
        let start = new Date().getTime()
        await new Promise((resolve) => { setTimeout(resolve, 1000) })
        return (new Date().getTime() - start)
      }
    },
    'slowCPUJob': {
      plugins: [],
      pluginOptions: {},
      perform: async () => {
        let start = new Date().getTime()
        blockingSleep(1000)
        return (new Date().getTime() - start)
      }
    }
  }

  // ////////////////
  // ENQUEUE TASKS //
  // ////////////////

  const queue = new NodeResque.Queue({connection: connectionDetails}, jobs)
  await queue.connect()
  var i
  i = 0
  while (i < 10) {
    await queue.enqueue('slowQueue', 'slowCPUJob', [])
    i++
  }

  i = 0
  while (i < 100) {
    await queue.enqueue('slowQueue', 'slowSleepJob', [])
    i++
  }

  // ///////
  // WORK //
  // ///////

  const multiWorker = new NodeResque.MultiWorker({
    connection: connectionDetails,
    queues: ['slowQueue']
  }, jobs)

  // normal worker emitters
  multiWorker.on('start', (workerId) => { console.log(`worker[${workerId}] started`) })
  multiWorker.on('end', (workerId) => { console.log(`worker[${workerId}] ended`) })
  multiWorker.on('cleaning_worker', (workerId, worker, pid) => { console.log('cleaning old worker ' + worker) })
  multiWorker.on('poll', (workerId, queue) => { console.log(`worker[${workerId}] polling ${queue}`) })
  multiWorker.on('job', (workerId, queue, job) => { console.log(`worker[${workerId}] working job ${queue} ${JSON.stringify(job)}`) })
  multiWorker.on('reEnqueue', (workerId, queue, job, plugin) => { console.log(`worker[${workerId}] reEnqueue job (${plugin}) ${queue} ${JSON.stringify(job)}`) })
  multiWorker.on('success', (workerId, queue, job, result) => { console.log(`worker[${workerId}] job success ${queue} ${JSON.stringify(job)} >> ${result}`) })
  multiWorker.on('failure', (workerId, queue, job, failure) => { console.log(`worker[${workerId}] job failure ${queue} ${JSON.stringify(job)} >> ${failure}`) })
  multiWorker.on('error', (error, workerId, queue, job) => { console.log(`worker[${workerId}] error #{queue} ${JSON.stringify(job)} >> ${error}`) })
  multiWorker.on('pause', (workerId) => { console.log(`worker[${workerId}] paused`) })

  // multiWorker emitters
  multiWorker.on('internalError', (error) => { console.log(error) })
  multiWorker.on('multiWorkerAction', (verb, delay) => { console.log(`*** checked for worker status: ${verb} (event loop delay: ${delay}ms)`) })

  multiWorker.start()

  process.on('SIGINT', async () => {
    await multiWorker.stop()
    console.log('*** ALL STOPPED ***')
    process.exit()
  })
}