使用percolate的多个cron作业:synced-cron

时间:2016-02-03 13:06:04

标签: javascript meteor cron

嘿伙计们,我会在特定时间之后尝试向我的收藏中的某些用户发送电子邮件。用户填写表格:

  Template.decisionSetUp.events({
    'submit form':function(event,t){
     var closeDateDB = moment($('[name="date"]').val(), 'DD.MM.YYYY HH:mm').toDate();
    Questions.insert({closeDateDB: closeDateDB},
          function (error,results){
            Router.go('decision', {_id:results});
            var decisionId = results;
            console.log(decisionId);
            Meteor.call('decisionEndMail', decisionId);
         }
   );
});

在此之后我实施了一个cron作业:

Meteor.methods({'decisionEndMail':function(decisionId) {
      var t = Questions.findOne({_id:decisionId}).closeDateDB;
      console.log(t);

    SyncedCron.add({
    name: 'demo',
    schedule: function (parser) {
    return parser.recur().on(t).fullDate();
    },
    job: function () {
    // job code
    console.log('job function just ran');
    }
    });
    SyncedCron.start();
    }

  });

问题是,它只接受第一个meteor.call。例如,如果我在13:30设置了closeDateDB并且我在13:40设置了另一个,那么该工作仅针对第一个进行。第二个在13:40从未执行过。我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

问题在于您使用相同的名称两次调用SyncedCron.add()。看看添加cron的代码,你会看到它默默地忽略任何添加了相同名称的作业。

https://github.com/percolatestudio/meteor-synced-cron/blob/master/synced-cron-server.js#L122-L129

if (!this._entries[entry.name]) {
  this._entries[entry.name] = entry;

  // If cron is already running, start directly.
  if (this.running) {
    scheduleEntry(entry);
  }
}

一个选项是在您对同步cron的调用中设置name: 'decision_'+decisionId,这将确保该名称是唯一的(假设您每次只做一次“{1}}调用”#39} ;)