我处在一个独特的情况下,我同时或几乎在同一时间收到来自10-25个来源的重复消息。我用来反击这个的代码是:
private Queue<String> messages = new ConcurrentLinkedQueue<>();
public void log(String message) {
if(!messages.contains(message)) {
if(messages.size() >= 5) {
messages.remove(0);
}
messages.add(message);
Main.getLogger().info(message);
}
}这段代码的问题在于,由于该方法是并发调用的,它有时会记录2-4次消息,而不是只记录一次。
发布于 2015-08-25 10:00:43
考虑将对记录器的实际写入放在一个单独的线程中,该线程从线程安全队列读取传入的日志消息,并在写入之前检查重复项。执行日志记录的应用程序将简单地将日志消息写入队列,而编写器将监视队列中是否有新消息。当一条消息传入时,会根据之前的一些消息检查它的唯一性,如果它是唯一的,则将其写入队列并存储在一组较旧的消息中以进行检查(可能会推出较旧的消息)。
https://stackoverflow.com/questions/32194267
复制相似问题