我正在使用 Java 邮件 API 接收来自多个 gmail 帐户的邮件。不同的帐户正在由不同的线程处理,我正在使用 aLinkedBlockingQueue
来存储电子邮件。但是,我不希望将相同的电子邮件重复添加到Queue
. 这是我到目前为止的代码:
public synchronized void readMail(){
try {
boolean alreadyAdded = false;
Folder inbox = store.getFolder("Inbox");
inbox.open(Folder.READ_ONLY);
Message [] received = inbox.getMessages();
if(messages.isEmpty()){
for(Message newMessage:received){
System.out.println("Queue empty, adding messages");
messages.put(newMessage);
}
}
else{
for(Message existingMessage:messages){
for(Message newMessage:received){
if (alreadyAdded == true)
break;
else{
if(existingMessage.getSubject().equals(newMessage.getSubject())){
alreadyAdded = true;
System.out.println("boolean changed to true, message "+newMessage.getSubject()+"won't be added");
}
else{
alreadyAdded = false;
System.out.println("Non-duplicate message "+newMessage.getSubject());
messages.put(newMessage);
}
}
}
}
}
}
catch (MessagingException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
我遇到的问题是在检查队列是否为空else
之后的块中。if
我希望它检查刚刚读入的消息集,并将这些消息与Queue
. 如果消息在,Queue
请不要再次添加。我不能简单地使用.contains()
,因为每次下载消息时,它们都会被赋予不同的内存位置,因此尽管Message
对象实际上可能是相同的(例如具有相同的主题、内容等),但它不会具有相同的签名(例如第一次下载它可能是Messagehgshsh676767
但下一次可能是Messageyyetwt8965
)。
我碰到了一堵砖墙,谁能建议一种方法来确保不添加重复项?