通过流星工作集合开始工作

时间:2015-11-06 18:56:22

标签: javascript node.js meteor jobs

我正在使用meteor-job-collectionhttps://github.com/vsivsi/meteor-job-collection);但是,我无法创造一份工作。

我有一个定义为

的方法
Meteor.methods( {
  insertItems: function ( dataArray ) {
    check( dataArray, [ Object ] );

    dataArray.forEach( function ( element ) {
      [...]
    } );
  }
} );

但该方法对内存要求很高,所以我想把它包装在一个工作中。我该如何开始这份工作?

我试过了

var job = new Job( Jobs, 'insertItems', data ).priority( 'normal' ).retry(
  {
    retries: 5,
    wait: 15 * 60 * 1000
  }
).delay( 60 * 60 * 1000 ).save();

但我收到了错误

Error invoking Method 'jobQueue_jobSave': Internal server error [500]

我的作业集定义为

Jobs = JobCollection( 'jobQueue' );

if ( Meteor.isServer ) {
  Jobs.allow( {
    admin: function ( userId, method, params ) {
      return true;
    },
  } );
}

1 个答案:

答案 0 :(得分:2)

您的代码中缺少多个内容。

1 - 确保在提交任何作业之前启动作业服务器。在服务器上的jobCollection上调用 startJobServer()

Jobs = JobCollection( 'jobQueue' );

if ( Meteor.isServer ) {
  Jobs.allow( {
    admin: function ( userId, method, params ) {
      return true;
    },
  } );
  Jobs.startJobServer();
}

2 - 您需要实施作业处理。作业只不过是一个附带数据的标签,计划在某个时间点运行。处理程序实现作业逻辑。在你的情况下你需要这样的东西:

var workers = Job.processJobs('jobQueue', 'insertItems',
  function (job, cb) {
    insertData = job.data;
    // do anything with the job data here.
    // when done, call job.done() or job.fail()

    job.done(); // when done successfully
    job.fail("with reason or error"); //when failing

    // Be sure to invoke the callback
    // when work on this job has finished
    cb();
  }
);