应用程序(Webinterface + Cron-Jobs + HTTP-Clients) - JAVA与NODEJS

时间:2016-07-08 02:19:11

标签: node.js multithreading cron

iam使用以下组件编写原型应用程序:

  • 管理员的网络界面
  • 做cron工作(统计数据生成,......)
  • 通过http
  • 与其他网络服务互动

我开始用nodejs(typescript)编程,我得到了与其他服务的连接。现在我在nodejs中遇到了cron-jobs的问题。 我使用node-cron来执行cronjob。

在一项工作中,我需要获得更多pc的状态并对其进行总结。如果我这样做,这将阻止主线程。 所以我认为我需要在一个单独的线程中。

我如何在nodejs中执行此操作?我应该使用webworker-threads吗? 我是在正确的方式吗? 我应该更好地使用Java(Grails / Spring)吗? 我非常喜欢nodejs的简单性(对于http客户端,...)

希望有人能以正确的方式给我希望。

1 个答案:

答案 0 :(得分:0)

我将使用Node Cluster。使用集群,master可以创建多个worker,这意味着你的cron不会阻止传入的请求。只要确保只有一名工人在做Cron。

我之前从未使用过node-cron,但我有使用SyncedCron的经验。但应该是一样的。

对于http客户端,有很多库可以执行此操作,您可以检查Requesthttpclient

您的代码应如下所示:

var cluster = require('cluster');
var http = require('http');
var numWorkers = require('os').cpus().length-1; // just give 1 cpu for OS to use, or maybe 2

if (cluster.isMaster) {
   console.log('Master cluster setting up ' + numWorkers + ' workers...');
   var cronPID=null; 

   for(var i = 0; i < numWorkers; i++) {
     var worker=cluster.fork();
     if(i==0){
      //instructing the first worker to assume role of SyncedCron.
      worker.send('you do it!');
      cronPID=worker.process.pid;
      console.log("worker "+cronPID+" choosed as Cron worker!");
     }
   }
   cluster.on('online', function(worker) {
       console.log('Worker ' + worker.process.pid + ' is online');
   });
   cluster.on('exit', function(worker, code, signal) {
       // have to revive the worker
       console.log('Worker ' + worker.process.pid + ' died with code: ' + code + ', and signal: ' + signal);
       console.log('Starting a new worker');
       var newWorker=cluster.fork();
       if(cronPID==worker.process.pid)
       {   // need to re-elect a new cron worker! 
           newWorker.send('you do it!');
           cronPID=newWorker.process.pid;
           console.log("worker "+cronPID+" choosed as Cron worker!"); 
       }  
   });
}else
{  // worker sides
   process.on('message', (msg) => {
      // validate your message that you get
      // if validated, create a cron job here
   });
   // create your express below, I assume you use express instead of node's http library
   var express = require('express');
   var app = express();
   app.post...........

} 

注意:

  1. 要恢复主人,请使用“forever
  2. 之类的内容
  3. 您的服务器应该有多个核心,至少4个,但我建议更多(8个可能?)。