2016-10-17 3 views
0

저는 Nodejs에 약간의 초보자입니다. 저는 Nodejs Express 솔루션으로 일하고 있습니다. 일부 정보가 MSSSQL 데이터베이스에 추가되면 전자 메일로 보내려고합니다. 이것은 나를 위해 잘 작동합니다. 문제는 5 분마다 데이터베이스에 추가 된이 정보가 수정되었는지 확인하고, 그렇지 않으면 다른 전자 메일을 보내려고합니다. DB를에 정보를 추가하는 호출이 경로입니다 : 전자 메일을 보내기위한Nodejs가 다른 스레드를 관리합니다

router.post('/postlinevalidation', function(req, res) { 
       //insert function into mssql 
        silkcartCtrl.sendMail(req, res); 
}); 

컨트롤러 부분 :

exports.sendMail = function(req, res) { 

      var emails = ""; 

      fs.readFile('./config/email.conf', 'utf8', function (err,data) { 
       if (err) { 
       return logger.error(err); 
       } 
       emails = data; 
      }); 

      var minutes = 5, the_interval = minutes * 60 * 1000; 
      var refreshId = setInterval(function() { 
       logger.info("I am doing my 5 minutes check FL_PENDIENTE"); 

        var request = new sql.Request(req.dbsqlserver); 
        var sqlpendinglinesvalidation = "SELECT [FK_IDCHECK],[FK_IDPEDIDO],[BK_IDPROVEEDOR],[DE_PROVEEDOR]"+ 
        ",[FK_FAMILIA],[BK_FAMILIA],[FK_SUBFAMILIA],[BK_SUBFAMILIA],[FK_ARTICULO]"+ 
        ",[BK_ARTICULO],[FL_VALIDAR],[DT_FECHA],[FL_PENDIENTE],[DES_CHECK],[QNT_PROPUESTA],[FECHA]"+ 
        "FROM TABLE"+ 
        " WHERE [FL_PENDIENTE] = 1"; 

        request.query(sqlpendinglinesvalidation, function (err, recordset) { 

        if (recordset.length > 0) { 
         var transporter = nodemailer.createTransport('smtps://user%40gmail.com:[email protected]'); 

         var mailOptions = { 
          from: '"Mailer" <[email protected]>', // sender address 
          to: emails, // list of receivers 
          subject: 'Tienes compras pendientes de validar', // Subject line 
          text: 'Tienes compras pendientes de validar', // plaintext body 
          html: '<b>Tienes compras pendientes de validar.</b>' // html body 
         }; 

         // send mail with defined transport object 
         transporter.sendMail(mailOptions, function(error, info){ 
          if(error){ 
           return logger.error(error); 
          } 
          logger.info('Message sent: ' + info.response); 
         }); 
        } else { 
         clearInterval(refreshId); 
         return true; 
        } 
        }); 
       }, the_interval); 
}; 

내가이 잘 작동되는 것을 특징으로한다. 나는 5 분을 제어한다 setInterval 그러나 나는 postlinevalidation 경로가 호출 될 때마다 supossed, 새로운 스레드가 열려 있기 때문에 몇개의 setInterval 프로세스가 실행 중이다. 관리 방법을 알고 싶습니다. 컨트롤러 기능 exports.sendMail가 실행중인 경우, 경로를 다시 호출 할 때, "이 프로세스를 종료", 사전

+0

process.exec 또는 process.fork에 의해 달성 될 수 있지만 문서를 검토하면 얻을 수 있습니다. Node.js는 수동 멀티 테 더딩을 위해 설계되지 않았습니다. Node.js에서 여러 스레드를 자주 사용해야하는 경우 기술 또는 아키텍처를 전환 할 때가 많습니다. –

답변

1

다시 exports.sendMail

감사를 시작하지만 경로 postlinevalidation가하는 호출 될 때마다 supossed 새 스레드가 열려 있으므로 몇 가지 setInterval 프로세스 이 실행됩니다.

아니요, 이것은 node.js가 작동하는 방식이 아닙니다. setInterval() 타이머가 여러 개 있기 때문에 다중 스레드를 얻지 못합니다.

node.js 자체는 단일 스레드입니다. 따라서 경로가 호출 될 때마다 node.js 이벤트 대기열에 이벤트가 만들어지고 한 번에 하나씩 FIFO가 제공됩니다. 라우트 핸들러 중 하나가 비동기 호출을하는 지점에서 제어는 원래 "반환"되고 이벤트 대기열의 다음 항목은 산출 또는 완료 될 때까지 실행됩니다.

setInterval() 같은 타이머도 이벤트 대기열을 사용하므로 setInterval()에 의해 추가 스레드가 생성되지 않습니다. 네이티브 코드를 사용하는 node.js 모듈 자체가 스레드를 사용할 수 있으며 node.js가 디스크 관리에 사용하는 작은 스레드 풀을 사용하지만 그 중 어느 것도 setInterval()과 아무 관련이 없습니다.

node.js에서 장기 실행 작업에 대한 다른 실행 컨텍스트를 명시 적으로 만들어 단일 node.js 스레드와 분리하려는 경우 node.js에 속하는 하위 프로세스 모듈을 사용하여 수행합니다 . 새 프로세스 (node.js 프로세스 또는 프로세스에서 실행중인 다른 프로그램 일 수 있음)를 작성하면 다른 프로세스와 통신 할 수 있습니다.

컨트롤러 기능 exports.sendMail가 실행중인 경우 경로 다시 호출 될 때, "이 프로세스를 종료"및이해야 뭔가 다시 exports.sendMail

시작 진행중인 작업을 취소 할 수 있도록 nodemailer 모듈의 명시적인 기능입니다. "진행중인"비동기식 작업이 구현되고 제어되는 방식은 일반적인 node.js가 아니지만 특정 모듈이 사물을 구현하고 사물을 추적하는 방법에 따라 다릅니다.

노드 메일러, 특히 smtp 연결 모듈의 코드를 보면 일반 비동기 node.js 소켓 코드가 사용 된 것처럼 보입니다. 즉, 새로운 스레드 나 프로세스를 자체적으로 만들지는 않습니다.

setInterval() 호출의 경우 setInterval()을 생성하는 코드 본문이 간격 타이머 ID를 추적하여 결국 간격을 지우고 중지되므로 계속 늘어나지 않도록해야합니다 간격 타이머. 또 다른 가능성은 하나의 간격 만 있고 모든 대기중인 작업을 확인하는 것입니다 (각 작업마다 별도의 간격이 아닌).

0

간략한 설명으로, sendMail 함수를 postlinevalidation에 넣을 필요가 없다고 생각합니다. 당신이 그것을 제어하고 싶다면, 당신은 익스프레스 애플 리케이션에서 다른 스크립트에서 실행할 수 있습니다. pm2 또는 parallelshell과 같은 것을 사용하여 동시에 여러 스크립트를 실행할 수 있습니다.

0

setInterval을 사용하는 경우 clearInterval을 사용하여 조건에 따라 setInterval을 중지 할 수 있습니다. setInterval 함수를 호출 할 때마다 setInterval을 중지 할 수있는 ID를 반환합니다.

var interval = setInterval(doStuff, 5000); 
function doStuff() { 
    if(your_condition) { 
    clearInterval(interval); 
    } 
} 
관련 문제