MimeMessage.writeTo (OutputStream) зависает - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь прочитать почту в почтовом ящике, но во время парсинга содержимого сообщения в MimeMessage какая-то конкретная почта приводит к зависанию процесса, в нем не отображаются сообщения об ошибках, журнал показывает, что программа останавливается на этапе MimeMessage.writeTo (OutputStream), ниже приведен фактический код

for (int n = message.length; i < n; i++)
            {Log25.write("IMAPaccess", "getMessages", "start convert");
                MimeMessage msg = (MimeMessage)message[i];
                Log25.write("IMAPaccess", "getMessages", "A");
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                Log25.write("IMAPaccess", "getMessages", "B");
                msg.writeTo(bos);
                Log25.write("IMAPaccess", "getMessages", "C");
                bos.close();
                Log25.write("IMAPaccess", "getMessages", "start create bis");
                SharedByteArrayInputStream bis = new SharedByteArrayInputStream(bos.toByteArray());
                MimeMessage cmsg = new MimeMessage(session, bis);
                bis.close();

....

ниже - информация журнала, она не показывает никаких исключений, но висит на «B», который находится на шаге «msg.writeTo (bos);» в журнале

Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     36:     [Ljavax.mail.internet.InternetAddress;@d522e24d null
Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     36: From address length         1
Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     36: From address        INFORMATION <info@funds.com>
Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     complete for loop j
Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     start convert
Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     A
Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     B
Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     C
Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     start create bis
Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     start cmsg to mimeMessage
Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     content type: text/html;^M
        charset="utf-8"
Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     37:     [Ljavax.mail.internet.InternetAddress;@9b58d2b8 null
Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     37: From address length         1
Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     37: From address        =?utf-8?B?6ZyN6bmD5Y6a?= <1757158944@qq.com>
Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     complete for loop j
Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     start convert
Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     A
Mon Sep 10 09:44:41 UTC 2018    IMAPaccess      getMessages     B

1 Ответ

0 голосов
/ 14 сентября 2018

В конце концов я отказался от преобразования типа сообщения, и если он зависает при преобразовании, я непосредственно позволил циклу for пропустить и продолжить, так что некоторые сообщения опускаются. Я не думаю, что это может иметь значение, потому что я нахожу, что только электронные письма со спамом могут заставить программу зависать. Ниже приведен код

for (int n = message.length; i < n; i++)
            {   
                Log25.write("IMAPaccess", "getMessages", "start convert");
                MimeMessage msg = (MimeMessage)message[i];

                ByteArrayOutputStream bos = new ByteArrayOutputStream();


                // MJN1 has some SPAM email cannot be converted, so use thread to do the conversion 
                final Runnable stuffToDo = new Thread() {
                      @Override 
                      public void run() { 
                          try {
                            Log25.write("IMAPaccess", "run", "write to MimeMessage");
                            msg.writeTo(bos);
                            Log25.write("IMAPaccess", "run", "wrote to MimeMessage");
                        } catch (IOException | MessagingException e) {
                            Log25.write("IMAPaccess", "run", (new StringBuilder()).append("error = ").append(e.getMessage()).toString());

                        }
                      }
                    };

                final ExecutorService executor = Executors.newSingleThreadExecutor();
                final Future future = executor.submit(stuffToDo);
                executor.shutdown(); // This does not cancel the already-scheduled task.

                // start the conversion and if the process hangs, the loop should skip and continue
                try { 
                  future.get(1, TimeUnit.SECONDS); 
                }
                catch (InterruptedException ie) { 
                    Log25.write("IMAPaccess", "getMessages", (new StringBuilder()).append("error = ").append(ie.getMessage()).toString());
                    continue;
                }
                catch (ExecutionException ee) { 
                    Log25.write("IMAPaccess", "getMessages", (new StringBuilder()).append("error = ").append(ee.getMessage()).toString());
                    continue;
                }
                catch (TimeoutException te) { 
                    Log25.write("IMAPaccess", "getMessages", (new StringBuilder()).append("error = ").append(te.getMessage()).toString());
                    continue;
                }
                catch(Exception e) {
                    Log25.write("IMAPaccess", "getMessages", (new StringBuilder()).append("error = ").append(e.getMessage()).toString());
                    continue;
                }
                if (!executor.isTerminated())
                    executor.shutdownNow();

                bos.close();

Я использовал thread и executor для продолжения цикла зависания, и это не легкая работа.

...