我正在使用meteor-job-collection
(https://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;
},
} );
}
答案 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();
}
);