我有一个程序应该监视我们的Dovecot IMAP服务器,并接收和处理Server发送的任何新消息。我遇到的问题是,消息被多次处理,即Dovecot多次发送同一消息的通知。
以下是我尝试过的技巧。
将侦听器附加到文件夹。无限地睡觉和获取信息。处理完标记后的消息。这不起作用,因为服务器没有足够快地更新看到的标志,因此会进行重新处理。
将侦听器附加到文件夹。无限地怠速。处理标记为已删除的邮件后。在循环浏览所有邮件并将其标记为已删除后,在messagesAdded
中,清除文件夹,关闭文件夹并重新打开文件夹。结果是它不处理所有消息,并且实际的mbox文件中的删除也不会发生,并且还会进行重新处理。
将侦听器附加到文件夹。无限地睡觉和闲逛。处理标记为已删除的邮件后。在循环浏览所有邮件并将其标记为已删除后,在messagesAdded
中,清除该文件夹。结果有时会重新处理。
我还能尝试什么?以下是我最近尝试的第三个用例的摘录。下面的方法在从主线程生成的守护程序线程中运行。
private static void listenMessages() {
try {
// Add messageCountListener to listen for new messages
_messageListener = new MessageCountAdapter() {
@Override
public void messagesAdded(MessageCountEvent ev) {
Message[] msgs = ev.getMessages();
// Send new messages to specified users
for (Message msg : msgs) {
try {
//
// Collect the whole message. Check if the
// DiscussionId has been set in the Header.
//
if(msg.isExpunged()) {
log.warn("Message is expunged, continue");
continue;
}
String sContents = null;
try {
log.info(msg.getSubject().toString());
sContents = getText(msg);
} catch(MessageRemovedException mo) {
log.warn("Message has already been processed and expunged, continue");
}
boolean bCollaborationService = isCollaborationService(sContents);
if (bCollaborationService) {
dispatchMessage(((InternetAddress) msg.getFrom()[0]).getAddress(), msg.getReceivedDate().getTime(), sContents);
}
msg.setFlag(Flags.Flag.DELETED, true);
} catch (IOException ioex) {
log.error(ioex.getMessage(), ioex);
} catch (MessagingException mex) {
log.error(mex.getMessage(), mex);
}
}
try {
_folder.expunge();
} catch (MessagingException e) {
// TODO Auto-generated catch block
log.error("Error Deleting Messages", e);
}
}
};
_folder.addMessageCountListener(_messageListener);
// Check mail once in "freq" MILLIseconds
int freq = 20000;
while (_messageListener != null) {
try {
Thread.sleep(freq); // sleep for freq milliseconds
} catch (InterruptedException e) {
// We've been interrupted: no more messages.
log.error("I have been interrrupted from MailRouter "
+ e.getMessage(), e);
}
_folder.idle();
}
} catch (Exception ex) {
log.error("Exception Occuered: " + ex.getMessage(), ex);
}
}
答案 0 :(得分:0)
如果您的问题与Dovecot的怪癖或您处理信息的方式有关,这有点难以辨别......
您的邮件是否处理单线程?如果是这样,跟踪您处理的最高消息编号或消息UID是否足够?
您是否担心如果您的邮件处理应用程序在处理邮件过程中崩溃会发生什么?
我们可能需要了解更多您的要求,以确定最佳的继续方式。