簡體   English   中英

無法加載com.sun.mail.handlers.multipart_mixed

[英]Could not load com.sun.mail.handlers.multipart_mixed

我們使用Javamail api創建了一個偵聽器,以讀取電子郵件收件箱中新添加的消息。 偵聽器收到新消息后,我們將嘗試獲取所有標頭信息以及內容部分。 為了解析內容,我們編寫了適當的解析邏輯,它適用於所有類型的內容(文本,html,多部分等)。 這是解析代碼。

private String getText(Part p) throws MessagingException, IOException {
        if (p.isMimeType("text/*")) {
            String s = (String) p.getContent();         
            return s;
        }

        if (p.isMimeType("multipart/alternative")) {
            // prefer html text over plain text
            Multipart mp = (Multipart) p.getContent();
            String text = null;
            for (int i = 0; i < mp.getCount(); i++) {
                Part bp = mp.getBodyPart(i);
                if (bp.isMimeType("text/plain")) {
                    if (text == null){
                        text = getText(bp);
                        return text;
                    }

                } else if (bp.isMimeType("text/html")) {
                    String s = getText(bp);
                    if (s != null)
                    return s;

                } else {
                    return getText(bp);
                }
            }
            return text;
        } else if (p.isMimeType("multipart/*")) {
            Multipart mp = (Multipart) p.getContent();
            for (int i = 0; i < mp.getCount(); i++) {
                String s = getText(mp.getBodyPart(i));
                if (s != null)
                    return s;
            }
        }

        return null;
    }

通過上面的偵聽器和解析,我們正在Web應用程序中運行,該Web應用程序部署在tomcat容器(版本-Apache tomcat 8.0.35)中。

在一段時間之后,當我們使IMAP連接的會話超時時,我們將通過編程方式重新啟動偵聽器。 現在,偵聽器可以將新添加的郵件讀取到收件箱,但是郵件內容解析失敗了以下異常。 我們嘗試了多種方法來解決此問題,但未成功。 以下是異常堆棧跟蹤

25-Mar-2016 14:08:10.158 INFO [JavaMail-EventQueue] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading Illegal access: this web application instance has been stopped already. Could not load [com.sun.mail.handlers.multipart_mixed]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
 java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [com.sun.mail.handlers.multipart_mixed]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
    at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1328)
    at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1316)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1181)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1142)
    at javax.activation.MailcapCommandMap.getDataContentHandler(MailcapCommandMap.java:582)
    at javax.activation.MailcapCommandMap.createDataContentHandler(MailcapCommandMap.java:560)
    at javax.activation.CommandMap.createDataContentHandler(CommandMap.java:221)
    at javax.activation.DataHandler.getDataContentHandler(DataHandler.java:615)
    at javax.activation.DataHandler.getContent(DataHandler.java:542)
    at javax.mail.internet.MimeMessage.getContent(MimeMessage.java:1419)
    at omniquo.awe.util.MailUtil.readMailBody(MailUtil.java:152)
    at omniquo.awe.activitiservice.MailListner$MailThreadListener$2.messagesAdded(MailListner.java:165)
    at javax.mail.event.MessageCountEvent.dispatch(MessageCountEvent.java:150)
    at javax.mail.EventQueue.run(EventQueue.java:134)
    at java.lang.Thread.run(Thread.java:745)

Unable to parse Email com.sun.mail.imap.IMAPInputStream cannot be cast to javax.mail.internet.MimeMultipart
java.lang.ClassCastException: com.sun.mail.imap.IMAPInputStream cannot be cast to javax.mail.internet.MimeMultipart
    at omniquo.awe.util.MailUtil.readMailBody(MailUtil.java:152)
    at omniquo.awe.activitiservice.MailListner$MailThreadListener$2.messagesAdded(MailListner.java:165)
    at javax.mail.event.MessageCountEvent.dispatch(MessageCountEvent.java:150)
    at javax.mail.EventQueue.run(EventQueue.java:134)
    at java.lang.Thread.run(Thread.java:745)

我們需要一個具體的解決方案來解決此問題。 我們正在使用以下環境和api版本

JDK- 1.8.0_65,Tomcat-8.0.35,Java郵件-1.5.5,Spring-4

很難理解如果沒有任何改變,為什么這將開始失敗。 您確實需要找出發生了什么變化。 您是否正在使用JDK或Tomcat的較新版本?

“通過編程方式重新啟動偵聽器”到底是什么意思? 您要重新啟動Tomcat服務器嗎?

通常會發生此問題,因為JavaBeans激活框架(JAF,現在是JDK的一部分)無法找到描述用於MIME類型的Java類的配置文件。 此配置文件是JavaMail jar文件的一部分。 如果您的應用程序被更改而該文件丟失了,那就可以解釋了。 如果您使用一些異常的類加載方案,則由於ClassLoader的問題也可能發生這種情況。

如果要重新加載webapp,則javax.mail.EventQueue將捕獲第一個webapp類加載器。 創建新線程時,上下文類加載器將設置為父線程的上下文類加載器。

synchronized void enqueue(MailEvent event, Vector vector) {
    // if this is the first event, create the queue and start the event task
    if (q == null) {
        q = new LinkedBlockingQueue<QueueElement>();
        if (executor != null) {
            executor.execute(this);
        } else {
            Thread qThread = new Thread(this, "JavaMail-EventQueue");
            qThread.setDaemon(true);  // not a user thread
            qThread.start();
        }
    }
    q.add(new QueueElement(event, vector));
}

修改您的MessageCountListener以設置上下文類加載器:

public void messagesAdded(MessageCountEvent e) {
    Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
    //Your existing code....
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM