我有一个解析应用程序,该应用程序通过TCP连接到计算机,并等待从计算机发送数据。发送数据后,我必须解析消息以正确组织SQL表的内容。当前,机器可能会发送多行消息,每条消息都具有四个组成部分的有效负载,或者它们可能会发送带有四分量有效载荷的单行消息。
当前必须以正确的顺序插入记录,以便以后针对数据库运行的自动化任务。不幸的是,当多行消息进入并被解析时,记录经常以随机顺序插入。我可以引入一些排队功能来确保按顺序插入事物吗?
我的代码的简化示例如下:
收集数据:
clients[i].on('data', function(data) {
console.log("Data: " + data + " " + hosts[j]);
parse_message(data, hosts[j][1], hosts[j][2]);
});
解析字符串和有效负载组件:
function parse_message(data, m_id, type) {
//console.log('Message received = ' + data);
var msg = data.toString('utf8'); // Convert from object class, split CRs
var strings = msg.split('\r\n'); // split multi-line data
console.log("Strings: " + strings)
strings.forEach(function(element) {
var payload = element.split("///"); // split by separator
if (payload.length == 4) { // If array is properly formed
payload[3] = payload[3].trim();
if (payload[3].includes('N')) {
payload[3] = payload[3].slice(1, payload[3].length);
}
payload[4] = m_id; // Send machine ID
payload[5] = dt.getDateTime();
if (type == 'Machine') {
Insert_Machine(payload);
}
else if (type == 'Pallet') {
Insert_Pallet(payload);
}
else {
console.log("Type didn't come through. Where am I supposed to put this?")
}
}
});
}
插入繁琐和承诺:
function Insert_Machine(msg, callback) {
var result = [];
var deferred = q.defer(); // init promise
var connection = new Connection(machine_config);
connection.on('connect', function(err) {
var request = new Request( // set up request structure
'INSERT INTO dbo.Data_new (pp_id, d_No, d_Note, d_Data, d_seq, d_machine, d_DateTime) OUTPUT INSERTED.Id VALUES (@pp_id, @d_No, @d_Note, @d_Data, 0, @d_machine, @d_DateTime);',
function(err, rowCount) {
if (err) {
console.log(err); // print error on console if anything happens
}
else {
console.log(rowCount + ' rows inserted to Machine_Data: ' + msg); // confirm the insert
}
deferred.resolve(result); // resolve promise
});
request.on('row', function(columns){
result.push(columns);
});
request.addParameter('pp_id', TYPES.NVarChar, msg[0]);
request.addParameter('d_No', TYPES.NVarChar, msg[1]);
request.addParameter('d_Note', TYPES.NVarChar, msg[2]);
request.addParameter('d_Data', TYPES.NVarChar, msg[3]);
request.addParameter('d_machine', TYPES.NVarChar, msg[4]);
request.addParameter('d_DateTime', TYPES.NVarChar, msg[5]);
// Execute SQL statement
connection.execSql(request);
}
);
return deferred.promise;
}