Я думаю, вы должны изменить экспресс-код на это, это будет намного эффективнее.
router.post("/:id/proxies", async (req, res) => {
// req.body.proxies contains the array that needs to be pushed in the proxies array
// addToSet makes sure that the elements are not repeated
await Project.findByIdAndUpdate(req.params.id, { $addToSet: { proxies: req.body.proxies } });
res.end();
});
Способность продолжить читать файл и ожидать вокруг до файла имеет еще некоторые обновления для Вас, не должен быть то, что трудно выполнить в коде самих. Вот некоторый псевдокод:
BufferedReader br = new BufferedReader(...);
String line;
while (keepReading) {
line = reader.readLine();
if (line == null) {
//wait until there is more of the file for us to read
Thread.sleep(1000);
}
else {
//do something interesting with the line
}
}
я предположил бы, что Вы захотите поместить этот тип функциональности в его собственном Потоке, так, чтобы можно было спать он и не влиять на любые другие области применения. Вы хотели бы выставить keepReading
в методе set так, чтобы Ваш основной класс / другие части приложения мог безопасно завершить работу потока без любых других головных болей, просто путем вызова stopReading()
или что-то подобное.
Проверьте JLogTailer, который делает эту логику.
основной момент в коде:
public void run() {
try {
while (_running) {
Thread.sleep(_updateInterval);
long len = _file.length();
if (len < _filePointer) {
// Log must have been jibbled or deleted.
this.appendMessage("Log file was reset. Restarting logging from start of file.");
_filePointer = len;
}
else if (len > _filePointer) {
// File must have had something added to it!
RandomAccessFile raf = new RandomAccessFile(_file, "r");
raf.seek(_filePointer);
String line = null;
while ((line = raf.readLine()) != null) {
this.appendLine(line);
}
_filePointer = raf.getFilePointer();
raf.close();
}
}
}
catch (Exception e) {
this.appendMessage("Fatal error reading log file, log tailing has stopped.");
}
// dispose();
}
Вот рассказ, который Вы могли использовать в качестве указателя:
я кодировал TailingInputStream на работе по той же самой причине. Это в основном использует Файл и обновило его содержание по требованию и проверило по внутреннему буферу, если это значительно изменило (штамп памяти 4 КБ IIRC) и затем сделало то, что делает хвост-f. Немного hacky, да, но это работает отлично и не смешивает с Потоками, или что-либо полагает как этот - это совместимо полностью назад с 1.4.2, по крайней мере.
Тем не менее было намного легче сделать, чем ReverseInputStream, который пошел от конца файла для запуска и не умер, если файл был обновлен на лету...