Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaMail:random MessageRemovedException问题_Java_Weblogic_Jakarta Mail - Fatal编程技术网

JavaMail:random MessageRemovedException问题

JavaMail:random MessageRemovedException问题,java,weblogic,jakarta-mail,Java,Weblogic,Jakarta Mail,我正在用JavaMail 1.4(Weblogic 10.3.5)开发一个web邮件客户端,但我遇到了一个问题。 我从IMAPMessage.getMessageID()随机获得MessageRemovedException,即使我检查消息是否已被删除 代码如下: Message[] msgsAll = folder.getMessages(); Message[] msgs = null; for(int a=0; a&l

我正在用JavaMail 1.4(Weblogic 10.3.5)开发一个web邮件客户端,但我遇到了一个问题。 我从
IMAPMessage.getMessageID()
随机获得MessageRemovedException,即使我检查消息是否已被删除

代码如下:

            Message[] msgsAll = folder.getMessages();
            Message[] msgs = null;
            for(int a=0; a<msgsAll.length; a++){
                if(!msgsAll[a].isExpunged()){
                    if(((((MimeMessage)msgsAll[a]).getMessageID()).compareTo(customMailBean.getMimeMessageId())==0)){   
                       msgs = new Message[]{msgsAll[a]};
                       break;
                    }
                }
            }

            if(msgs.length != 0){               
               folder.setFlags(msgs, new Flags(Flags.Flag.SEEN), true);
               folder.copyMessages(msgs, dfolder);
               folder.setFlags(msgs, new Flags(Flags.Flag.DELETED), true);                  
            }

           folder.close(true);
           store.close();
如您所见,只有在当前消息未被删除的情况下,我才调用
IMAPMessage.getMessageID()
方法,那么为什么我会得到MessageRemovedException呢?我的客户端是否与服务器不同步? 这是由于并发错误造成的吗

此外,“已删除”消息仍在原始文件夹中(几乎一周后),但其删除标志为FALSE,这意味着它甚至没有被标记为删除!如果它被“移除”,这怎么可能呢


谢谢。

来自文档:由其他源从外部删除的邮件标记为“已删除”,isExpunged()方法返回true,但在对文件夹执行显式删除()之前,不会从文件夹中删除这些邮件。你会是这样吗?嗨,阿米尔,邮件在一周后仍在原始文件夹中,无论如何,它的删除标志为FALSE,因此它没有被标记为删除。isExpunged方法不会与服务器检查邮件是否已被删除,它仅检查在服务器通知客户端消息已被删除时设置的本地标志。如果服务器上的getMessageID调用失败,它会检查消息是否已被删除,即使它尚未看到来自服务器的通知。不管怎么说,你所做的事情中有一个固有的种族条件,因为在你检查之后消息可能会被删除。您最好的办法是捕获MessageRemovedException。至于为什么即使消息未被删除也会出现此异常,可能是JavaMail中存在错误,也可能是服务器中存在错误。我们需要查看协议跟踪,它可能会显示有关getMessageID调用失败原因的更多信息。此外,您可能希望通过使用Folder.search查找匹配的消息来简化代码。Bill,我们在生产环境中遇到了此问题,我们无法打印协议跟踪,并且我们无法在测试环境中重现此错误。无论如何,我修改了代码,在自定义消息bean中添加了对原始JavaMail消息的引用,因此我不必搜索它。此外,我正确地捕获了MessageRemovedException。我希望这些能解决问题。谢谢你的帮助。
javax.mail.MessageRemovedException
at com.sun.mail.imap.IMAPMessage.forceCheckExpunged(IMAPMessage.java:239)
at com.sun.mail.imap.IMAPMessage.loadEnvelope(IMAPMessage.java:1219)
at com.sun.mail.imap.IMAPMessage.getMessageID(IMAPMessage.java:531)
at com.sanpaoloimi.sitt0.valueteam.mail.ServiceMail.moveMail(ServiceMail.java:877)