Java メール API を使用して、複数の Gmail アカウントからメッセージを受信しています。さまざまなアカウントがさまざまなスレッドで処理されておりLinkedBlockingQueue
、メールを保存するために を使用しています。ただし、同じメールが繰り返し に追加されるのは望ましくありません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
)。
レンガの壁にぶつかりました。重複が追加されないようにする方法を誰か提案できますか?