Почему-то мы планируем использовать очередь kestrel в нашем проекте.Мы делаем несколько демонов, основная проблема в том, как извлечь данные из очереди с низкой загрузкой процессора и эффективно.Способ, который мы реализовали для извлечения, заключается в том, что если нам не удалось получить данные из очереди более 5 раз, мы засыпаем поток на 100 мс, чтобы уменьшить загрузку ЦП.
while (running) {
try {
LoginLogQueueEntry data = kestrelQueue.fetch();
if (null != data && data.isLegal()) {
entryCacheList.add(data); //add the data to the local caceh
resetStatus();
} else {
failedCount++;
//if there is no data in the kestrel and the local cache is not empty, insert the data into mysql database
if (failedCount == 1 && !entryCacheList.isEmpty()) {
resetStatus();
insertLogList(entryCacheList); // insert current data into database
entryCacheList.clear(); //empty local cache
}
if (failedCount >= 5 && entryCacheList.isEmpty()) {
//fail 5 times. Sleep current thread.
failedCount = 0;
Thread.sleep((sleepTime + MIN_SLEEP_TIME) % MAX_SLEEP_TIME);
}
}
//Insert 1000 rows once
if (entryCacheList.size() >= 1000) {
insertLogList(entryCacheList);
entryCacheList.clear();
}
} catch (Exception e) {
logger.warn(e.getMessage());
}
Есть ли другой хороший способ сделать это?Идеально, я думаю, что очередь может заметить работнику, что мы получили данные и извлекли их.