Node.js 在NodeJS服务器上,当验证作业运行时(需要半个小时),在这段时间内,整个应用程序停止工作
我正在使用MEAN stack开发我的应用程序。我的服务器有三个客户端app 1。iOS应用程序2。Android应用程序和3。基于浏览器的应用程序。所有应用程序均由单一服务器提供。当我运行一些长时间的数据处理工作时,我面临着这个问题。这项工作需要半小时才能完成一项处理。由于Nodejs的单线程模式,当这个作业开始运行时,在这半个小时内,三个应用程序都停止工作,因为服务器没有及时响应。以下是我的工作代码Node.js 在NodeJS服务器上,当验证作业运行时(需要半个小时),在这段时间内,整个应用程序停止工作,node.js,Node.js,我正在使用MEAN stack开发我的应用程序。我的服务器有三个客户端app 1。iOS应用程序2。Android应用程序和3。基于浏览器的应用程序。所有应用程序均由单一服务器提供。当我运行一些长时间的数据处理工作时,我面临着这个问题。这项工作需要半小时才能完成一项处理。由于Nodejs的单线程模式,当这个作业开始运行时,在这半个小时内,三个应用程序都停止工作,因为服务器没有及时响应。以下是我的工作代码 1. API to invoke this processing //API to val
1. API to invoke this processing
//API to validate all possible combinations
app.get('/api/validateworkouts/:clubid', SecurityService.isRestAPIRequestSecure, workoutValidateService.validateGeneratedWorkouts);
2. Following is code for validateGeneratedWorkouts function
module.exports = {
// Test generated workouts for all users and send email to admin team
validateGeneratedWorkouts: function (req, res) {
var clubid = req.params.clubid;
//update club status as inprogress in database
module.exports.updateClubWorkoutTestStatusAsInprogress(clubid, function () {
//Get user data from database
var query = {};
query.username = "user@validate.com";
documentOperationModule.getDocumentByQuery(query, constants.USER_COLLECTION, function (err, users) {
if (!err && !Utilities.isEmptyList(users)) {
//Get all goals data from database
query = {};
documentOperationModule.getDocumentByQuery(query, constants.GOAL_COLLECTION, function (err, goals) {
if (!err && !Utilities.isEmptyList(goals)) {
//Get all scheduleconfigfrequencies
query = {};
documentOperationModule.getDocumentByQuery(query, constants.SCHEDULE_CONFIG_FREQUENCIES_COLLECTION, function (err, scheduleconfigfrequencies) {
if (!err && !Utilities.isEmptyList(scheduleconfigfrequencies)) {
//Get all genders
query = {};
documentOperationModule.getDocumentByQuery(query, constants.GENDERS_COLLECTION, function (err, genders) {
if (!err && !Utilities.isEmptyList(genders)) {
//Get all experiences
query = {};
documentOperationModule.getDocumentByQuery(query, constants.EXPERIENCES_COLLECTION, function (err, experiences) {
if (!err && !Utilities.isEmptyList(experiences)) {
//Get all durationpreferences
query = {};
documentOperationModule.getDocumentByQuery(query, constants.DURATION_PREFERENCES_COLLECTION, function (err, durationpreferences) {
if (!err && !Utilities.isEmptyList(durationpreferences)) {
//Get all clubs
query = {};
documentOperationModule.getDocumentByQuery(query, constants.CLUB_COLLECTION, function (err, clubs) {
if (!err && !Utilities.isEmptyList(clubs)) {
var workoutRequestList = [];
//prepare workout request for each combinations //loop in each users
for (var i = 0; i < users.length; i++) {
//loop in each goals
for (var j = 0; j < goals.length; j++) {
//loop in each scheduleconfigfrequencies
for (var k = 0; k < scheduleconfigfrequencies.length; k++) {
//loop in each genders
for (var l = 0; l < genders.length; l++) {
//loop in each experiences
for (var m = 0; m < experiences.length; m++) {
//loop in each durationpreferences
for (var n = 0; n < durationpreferences.length; n++) {
var userid = users[i].userid;
var goalid = goals[j].goalid;
var gender = genders[l].genderid;
var experience = experiences[m].experienceid;
var durationpreference = durationpreferences[n].durationpreferenceid;
var frequency = scheduleconfigfrequencies[k].scheduleconfigfrequencyid;
//loop in for each possible workout sequence based on frequency
for (var nextworkoutseq = 0; nextworkoutseq < frequency; nextworkoutseq++) {
//Get list of workout request object
var workoutRequest = {};
workoutRequest.url = workoutURL;
workoutRequest.userid = userid;
workoutRequest.clubid = clubid;
workoutRequest.goalid = goalid;
workoutRequest.gender = gender;
workoutRequest.experience = experience;
workoutRequest.durationpreference = durationpreference;
workoutRequest.frequency = frequency;
workoutRequest.nextworkoutseq = nextworkoutseq;
//Add into list
workoutRequestList.push(workoutRequest);
}
}
}
}
}
}
}
//Generate workout and add into response if it fails
var failedWorkoutRequestsList = [];
//call getFailedWorkoutResponse for next workout request
module.exports.getFailedWorkoutResponse(req, workoutRequestList, 0, failedWorkoutRequestsList, function (failedWorkoutRequestsList) {
//update database for club testing status
module.exports.updateClubWorkoutTestStatus(clubid, failedWorkoutRequestsList, function () {
//get admin user email id
module.exports.getAdminUserEmailId(req, function (email) {
//Send email
module.exports.sendEmailForFailedWorkoutResponse(req, clubid, email, workoutRequestList, failedWorkoutRequestsList);
//Send response to service
if (!Utilities.isEmptyList(failedWorkoutRequestsList)) {
res.json(failedWorkoutRequestsList);
} else {
res.json({"message": "No error found in generated workouts :-)"});
}
});
});
});
} else {
req.log.error({err: err}, 'Unable to list all durationpreferences data.');
res.json({err: "Unable to list all durationpreferences data."});
}
});
} else {
req.log.error({err: err}, 'Unable to list all durationpreferences data.');
res.json({err: "Unable to list all durationpreferences data."});
}
});
} else {
req.log.error({err: err}, 'Unable to list all experiences data.');
res.json({err: "Unable to list all experiences data."});
}
});
} else {
req.log.error({err: err}, 'Unable to list all genders data.');
res.json({err: "Unable to list all genders data."});
}
});
} else {
req.log.error({err: err}, 'Unable to list all scheduleconfigfrequencies data.');
res.json({err: "Unable to list all scheduleconfigfrequencies data."});
}
});
} else {
req.log.error({err: err}, 'Unable to list all goals data.');
res.json({err: "Unable to list all goals data."});
}
});
} else {
req.log.error({err: err}, 'Unable to list all users data.');
res.json({err: "Unable to list all users data."});
}
});
});
}
};
1。调用此处理的API
//API来验证所有可能的组合
app.get('/api/validateworkout/:clubid',SecurityService.isRestAPIRequestSecure,workoutValidateService.validateGeneratedWorkouts);
2.以下是validateGeneratedWorkouts函数的代码
module.exports={
//为所有用户测试生成的训练,并向管理员团队发送电子邮件
ValidateGeneratedWorkout:功能(请求、恢复){
var clubid=req.params.clubid;
//在数据库中将俱乐部状态更新为“正在进行”
module.exports.updateClubWorkoutTestStatusAsInprogress(clubid,函数(){
//从数据库获取用户数据
var query={};
query.username=”user@validate.com";
documentOperationModule.getDocumentByQuery(查询,常量.USER\u集合,函数(err,用户){
如果(!err&&!Utilities.isEmptyList(用户)){
//从数据库中获取所有目标数据
查询={};
documentOperationModule.getDocumentByQuery(查询,常量.GOAL\u集合,函数(错误,目标){
如果(!err&&!Utilities.isEmptyList(goals)){
//获取所有scheduleconfigfrequencies
查询={};
documentOperationModule.getDocumentByQuery(查询,常量.SCHEDULE\u配置\u频率\u集合,函数(错误,scheduleconfigfrequencies){
if(!err&&!Utilities.isEmptyList(scheduleconfigfrequencies)){
//男女平等
查询={};
documentOperationModule.getDocumentByQuery(查询,常量.GENDERS\u集合,函数(err,GENDERS){
if(!err&&!Utilities.isEmptyList(genders)){
//获得所有经验
查询={};
documentOperationModule.getDocumentByQuery(查询,常量.EXPERIENCES\u集合,函数(err,EXPERIENCES){
if(!err&&!Utilities.isEmptyList(经验)){
//获取所有durationpreferences
查询={};
documentOperationModule.getDocumentByQuery(查询、常量.DURATION\u首选项\u集合、函数(err、durationpreferences){
if(!err&&!Utilities.isEmptyList(durationpreferences)){
//得到所有的俱乐部
查询={};
documentOperationModule.getDocumentByQuery(查询,常数.CLUB_集合,函数(err,clubs){
如果(!err&&!Utilities.isEmptyList(俱乐部)){
var-workoutRequestList=[];
//为每个用户中的每个组合//循环准备训练请求
对于(var i=0;i