Spring集成 - Imap连接错误处理

时间:2018-05-28 08:01:31

标签: spring-integration

我正在使用Spring Integration来读取邮箱中的电子邮件。

如果邮箱凭据不正确,我该如何处理异常?

IntegrationFlow flow = IntegrationFlows
                    .from(Mail.imapIdleAdapter(imapUrl(mailbox))
                            .javaMailProperties(p -> p.put("mail.debug", mailbox.isDebug()))
                    )
                    .transform(Transformers.fromMail())
                    .handle(message -> {
                        sender.sendEmailToQueue(message);
                    })
                    .get();

例外:

java.lang.IllegalStateException: Failure in 'idle' task. Will resubmit.
    at org.springframework.integration.mail.ImapIdleChannelAdapter$IdleTask.run(ImapIdleChannelAdapter.java:290) ~[spring-integration-mail-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.integration.mail.ImapIdleChannelAdapter$ReceivingTask.run(ImapIdleChannelAdapter.java:241) ~[spring-integration-mail-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) [spring-context-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81) [spring-context-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_101]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_101]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_101]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_101]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_101]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_101]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_101]
Caused by: com.sun.mail.util.MailConnectException: Couldn't connect to host, port: <HOST REMOVED***>, 993; timeout -1
    at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:733) ~[javax.mail-1.5.6.jar:1.5.6]
    at javax.mail.Service.connect(Service.java:366) ~[javax.mail-1.5.6.jar:1.5.6]
    at javax.mail.Service.connect(Service.java:246) ~[javax.mail-1.5.6.jar:1.5.6]
    at javax.mail.Service.connect(Service.java:195) ~[javax.mail-1.5.6.jar:1.5.6]
    at org.springframework.integration.mail.AbstractMailReceiver.connectStoreIfNecessary(AbstractMailReceiver.java:286) ~[spring-integration-mail-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.integration.mail.AbstractMailReceiver.openFolder(AbstractMailReceiver.java:293) ~[spring-integration-mail-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.integration.mail.ImapMailReceiver.waitForNewMessages(ImapMailReceiver.java:158) ~[spring-integration-mail-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    at org.springframework.integration.mail.ImapIdleChannelAdapter$IdleTask.run(ImapIdleChannelAdapter.java:271) ~[spring-integration-mail-4.3.14.RELEASE.jar:4.3.14.RELEASE]
    ... 10 common frames omitted
Caused by: java.net.UnknownHostException: <HOST REMOVED***>
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184) ~[na:1.8.0_101]
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.8.0_101]
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_101]
    at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_101]
    at java.net.Socket.connect(Socket.java:538) ~[na:1.8.0_101]
    at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:331) ~[javax.mail-1.5.6.jar:1.5.6]
    at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:238) ~[javax.mail-1.5.6.jar:1.5.6]
    at com.sun.mail.iap.Protocol.<init>(Protocol.java:123) ~[javax.mail-1.5.6.jar:1.5.6]
    at com.sun.mail.imap.protocol.IMAPProtocol.<init>(IMAPProtocol.java:126) ~[javax.mail-1.5.6.jar:1.5.6]
    at com.sun.mail.imap.IMAPStore.newIMAPProtocol(IMAPStore.java:756) ~[javax.mail-1.5.6.jar:1.5.6]
    at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:691) ~[javax.mail-1.5.6.jar:1.5.6]
    ... 17 common frames omitted

我调查过: https://docs.spring.io/spring-integration/reference/html/configuration.html#namespace-errorhandler

Spring Integration代码非常广泛,并且对它来说是新的。有点压倒性的。

任何建议都将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:1)

向上滚动至this section of the documentation上方的注释。

  

从3.0版本开始,IMAP空闲适配器在发生异常时发出应用程序事件(特别是ImapIdleExceptionEvent)。

ApplicationListener<ImapIdleExceptionEvent> bean添加到您的应用程序以接收这些事件(或@EventListener方法)。